1a9ded601SYang Zhong /* 2a9ded601SYang Zhong * QEMU System Emulator, accelerator interfaces 3a9ded601SYang Zhong * 4a9ded601SYang Zhong * Copyright (c) 2003-2008 Fabrice Bellard 5a9ded601SYang Zhong * Copyright (c) 2014 Red Hat Inc. 6a9ded601SYang Zhong * 7a9ded601SYang Zhong * Permission is hereby granted, free of charge, to any person obtaining a copy 8a9ded601SYang Zhong * of this software and associated documentation files (the "Software"), to deal 9a9ded601SYang Zhong * in the Software without restriction, including without limitation the rights 10a9ded601SYang Zhong * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11a9ded601SYang Zhong * copies of the Software, and to permit persons to whom the Software is 12a9ded601SYang Zhong * furnished to do so, subject to the following conditions: 13a9ded601SYang Zhong * 14a9ded601SYang Zhong * The above copyright notice and this permission notice shall be included in 15a9ded601SYang Zhong * all copies or substantial portions of the Software. 16a9ded601SYang Zhong * 17a9ded601SYang Zhong * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18a9ded601SYang Zhong * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19a9ded601SYang Zhong * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20a9ded601SYang Zhong * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21a9ded601SYang Zhong * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22a9ded601SYang Zhong * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23a9ded601SYang Zhong * THE SOFTWARE. 24a9ded601SYang Zhong */ 25a9ded601SYang Zhong 26a9ded601SYang Zhong #include "qemu/osdep.h" 27a9ded601SYang Zhong #include "sysemu/accel.h" 28a9ded601SYang Zhong #include "sysemu/sysemu.h" 29a9ded601SYang Zhong #include "qom/object.h" 30290dae46SPaolo Bonzini #include "qemu-common.h" 31*5e140196SRichard Henderson #include "cpu.h" 32290dae46SPaolo Bonzini #include "sysemu/cpus.h" 33290dae46SPaolo Bonzini #include "qemu/main-loop.h" 34a9ded601SYang Zhong 358b3ae692SPaolo Bonzini unsigned long tcg_tb_size; 36a9ded601SYang Zhong 37290dae46SPaolo Bonzini /* mask must never be zero, except for A20 change call */ 38290dae46SPaolo Bonzini static void tcg_handle_interrupt(CPUState *cpu, int mask) 39290dae46SPaolo Bonzini { 40290dae46SPaolo Bonzini int old_mask; 41290dae46SPaolo Bonzini g_assert(qemu_mutex_iothread_locked()); 42290dae46SPaolo Bonzini 43290dae46SPaolo Bonzini old_mask = cpu->interrupt_request; 44290dae46SPaolo Bonzini cpu->interrupt_request |= mask; 45290dae46SPaolo Bonzini 46290dae46SPaolo Bonzini /* 47290dae46SPaolo Bonzini * If called from iothread context, wake the target cpu in 48290dae46SPaolo Bonzini * case its halted. 49290dae46SPaolo Bonzini */ 50290dae46SPaolo Bonzini if (!qemu_cpu_is_self(cpu)) { 51290dae46SPaolo Bonzini qemu_cpu_kick(cpu); 52290dae46SPaolo Bonzini } else { 53*5e140196SRichard Henderson atomic_set(&cpu_neg(cpu)->icount_decr.u16.high, -1); 54290dae46SPaolo Bonzini if (use_icount && 55290dae46SPaolo Bonzini !cpu->can_do_io 56290dae46SPaolo Bonzini && (mask & ~old_mask) != 0) { 57290dae46SPaolo Bonzini cpu_abort(cpu, "Raised interrupt while not in I/O function"); 58290dae46SPaolo Bonzini } 59290dae46SPaolo Bonzini } 60290dae46SPaolo Bonzini } 61290dae46SPaolo Bonzini 62a9ded601SYang Zhong static int tcg_init(MachineState *ms) 63a9ded601SYang Zhong { 64a9ded601SYang Zhong tcg_exec_init(tcg_tb_size * 1024 * 1024); 65290dae46SPaolo Bonzini cpu_interrupt_handler = tcg_handle_interrupt; 66a9ded601SYang Zhong return 0; 67a9ded601SYang Zhong } 68a9ded601SYang Zhong 69a9ded601SYang Zhong static void tcg_accel_class_init(ObjectClass *oc, void *data) 70a9ded601SYang Zhong { 71a9ded601SYang Zhong AccelClass *ac = ACCEL_CLASS(oc); 72a9ded601SYang Zhong ac->name = "tcg"; 73a9ded601SYang Zhong ac->init_machine = tcg_init; 74a9ded601SYang Zhong ac->allowed = &tcg_allowed; 75a9ded601SYang Zhong } 76a9ded601SYang Zhong 77a9ded601SYang Zhong #define TYPE_TCG_ACCEL ACCEL_CLASS_NAME("tcg") 78a9ded601SYang Zhong 79a9ded601SYang Zhong static const TypeInfo tcg_accel_type = { 80a9ded601SYang Zhong .name = TYPE_TCG_ACCEL, 81a9ded601SYang Zhong .parent = TYPE_ACCEL, 82a9ded601SYang Zhong .class_init = tcg_accel_class_init, 83a9ded601SYang Zhong }; 84a9ded601SYang Zhong 85a9ded601SYang Zhong static void register_accel_types(void) 86a9ded601SYang Zhong { 87a9ded601SYang Zhong type_register_static(&tcg_accel_type); 88a9ded601SYang Zhong } 89a9ded601SYang Zhong 90a9ded601SYang Zhong type_init(register_accel_types); 91