cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

coroutine_int.h (2532B)


      1/*
      2 * Coroutine internals
      3 *
      4 * Copyright (c) 2011 Kevin Wolf <kwolf@redhat.com>
      5 *
      6 * Permission is hereby granted, free of charge, to any person obtaining a copy
      7 * of this software and associated documentation files (the "Software"), to deal
      8 * in the Software without restriction, including without limitation the rights
      9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     10 * copies of the Software, and to permit persons to whom the Software is
     11 * furnished to do so, subject to the following conditions:
     12 *
     13 * The above copyright notice and this permission notice shall be included in
     14 * all copies or substantial portions of the Software.
     15 *
     16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     22 * THE SOFTWARE.
     23 */
     24
     25#ifndef QEMU_COROUTINE_INT_H
     26#define QEMU_COROUTINE_INT_H
     27
     28#include "qemu/queue.h"
     29#include "qemu/coroutine.h"
     30
     31#ifdef CONFIG_SAFESTACK
     32/* Pointer to the unsafe stack, defined by the compiler */
     33extern __thread void *__safestack_unsafe_stack_ptr;
     34#endif
     35
     36#define COROUTINE_STACK_SIZE (1 << 20)
     37
     38typedef enum {
     39    COROUTINE_YIELD = 1,
     40    COROUTINE_TERMINATE = 2,
     41    COROUTINE_ENTER = 3,
     42} CoroutineAction;
     43
     44struct Coroutine {
     45    CoroutineEntry *entry;
     46    void *entry_arg;
     47    Coroutine *caller;
     48
     49    /* Only used when the coroutine has terminated.  */
     50    QSLIST_ENTRY(Coroutine) pool_next;
     51
     52    size_t locks_held;
     53
     54    /* Only used when the coroutine has yielded.  */
     55    AioContext *ctx;
     56
     57    /* Used to catch and abort on illegal co-routine entry.
     58     * Will contain the name of the function that had first
     59     * scheduled the coroutine. */
     60    const char *scheduled;
     61
     62    QSIMPLEQ_ENTRY(Coroutine) co_queue_next;
     63
     64    /* Coroutines that should be woken up when we yield or terminate.
     65     * Only used when the coroutine is running.
     66     */
     67    QSIMPLEQ_HEAD(, Coroutine) co_queue_wakeup;
     68
     69    QSLIST_ENTRY(Coroutine) co_scheduled_next;
     70};
     71
     72Coroutine *qemu_coroutine_new(void);
     73void qemu_coroutine_delete(Coroutine *co);
     74CoroutineAction qemu_coroutine_switch(Coroutine *from, Coroutine *to,
     75                                      CoroutineAction action);
     76
     77#endif