1*e2de2c49SDavid Hildenbrand /* 2*e2de2c49SDavid Hildenbrand * QEMU Thread Context 3*e2de2c49SDavid Hildenbrand * 4*e2de2c49SDavid Hildenbrand * Copyright Red Hat Inc., 2022 5*e2de2c49SDavid Hildenbrand * 6*e2de2c49SDavid Hildenbrand * Authors: 7*e2de2c49SDavid Hildenbrand * David Hildenbrand <david@redhat.com> 8*e2de2c49SDavid Hildenbrand * 9*e2de2c49SDavid Hildenbrand * This work is licensed under the terms of the GNU GPL, version 2 or later. 10*e2de2c49SDavid Hildenbrand * See the COPYING file in the top-level directory. 11*e2de2c49SDavid Hildenbrand */ 12*e2de2c49SDavid Hildenbrand 13*e2de2c49SDavid Hildenbrand #ifndef SYSEMU_THREAD_CONTEXT_H 14*e2de2c49SDavid Hildenbrand #define SYSEMU_THREAD_CONTEXT_H 15*e2de2c49SDavid Hildenbrand 16*e2de2c49SDavid Hildenbrand #include "qapi/qapi-types-machine.h" 17*e2de2c49SDavid Hildenbrand #include "qemu/thread.h" 18*e2de2c49SDavid Hildenbrand #include "qom/object.h" 19*e2de2c49SDavid Hildenbrand 20*e2de2c49SDavid Hildenbrand #define TYPE_THREAD_CONTEXT "thread-context" 21*e2de2c49SDavid Hildenbrand OBJECT_DECLARE_TYPE(ThreadContext, ThreadContextClass, 22*e2de2c49SDavid Hildenbrand THREAD_CONTEXT) 23*e2de2c49SDavid Hildenbrand 24*e2de2c49SDavid Hildenbrand struct ThreadContextClass { 25*e2de2c49SDavid Hildenbrand ObjectClass parent_class; 26*e2de2c49SDavid Hildenbrand }; 27*e2de2c49SDavid Hildenbrand 28*e2de2c49SDavid Hildenbrand struct ThreadContext { 29*e2de2c49SDavid Hildenbrand /* private */ 30*e2de2c49SDavid Hildenbrand Object parent; 31*e2de2c49SDavid Hildenbrand 32*e2de2c49SDavid Hildenbrand /* private */ 33*e2de2c49SDavid Hildenbrand unsigned int thread_id; 34*e2de2c49SDavid Hildenbrand QemuThread thread; 35*e2de2c49SDavid Hildenbrand 36*e2de2c49SDavid Hildenbrand /* Semaphore to wait for context thread action. */ 37*e2de2c49SDavid Hildenbrand QemuSemaphore sem; 38*e2de2c49SDavid Hildenbrand /* Semaphore to wait for action in context thread. */ 39*e2de2c49SDavid Hildenbrand QemuSemaphore sem_thread; 40*e2de2c49SDavid Hildenbrand /* Mutex to synchronize requests. */ 41*e2de2c49SDavid Hildenbrand QemuMutex mutex; 42*e2de2c49SDavid Hildenbrand 43*e2de2c49SDavid Hildenbrand /* Commands for the thread to execute. */ 44*e2de2c49SDavid Hildenbrand int thread_cmd; 45*e2de2c49SDavid Hildenbrand void *thread_cmd_data; 46*e2de2c49SDavid Hildenbrand 47*e2de2c49SDavid Hildenbrand /* CPU affinity bitmap used for initialization. */ 48*e2de2c49SDavid Hildenbrand unsigned long *init_cpu_bitmap; 49*e2de2c49SDavid Hildenbrand int init_cpu_nbits; 50*e2de2c49SDavid Hildenbrand }; 51*e2de2c49SDavid Hildenbrand 52*e2de2c49SDavid Hildenbrand void thread_context_create_thread(ThreadContext *tc, QemuThread *thread, 53*e2de2c49SDavid Hildenbrand const char *name, 54*e2de2c49SDavid Hildenbrand void *(*start_routine)(void *), void *arg, 55*e2de2c49SDavid Hildenbrand int mode); 56*e2de2c49SDavid Hildenbrand 57*e2de2c49SDavid Hildenbrand #endif /* SYSEMU_THREAD_CONTEXT_H */ 58