17c379526SPaolo Bonzini /* 27c379526SPaolo Bonzini * Hypervisor Maintenance Interrupt (HMI) handling. 37c379526SPaolo Bonzini * 47c379526SPaolo Bonzini * This program is free software; you can redistribute it and/or modify 57c379526SPaolo Bonzini * it under the terms of the GNU General Public License as published by 67c379526SPaolo Bonzini * the Free Software Foundation; either version 2 of the License, or 77c379526SPaolo Bonzini * (at your option) any later version. 87c379526SPaolo Bonzini * 97c379526SPaolo Bonzini * This program is distributed in the hope that it will be useful, 107c379526SPaolo Bonzini * but WITHOUT ANY WARRANTY; without even the implied warranty of 117c379526SPaolo Bonzini * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 127c379526SPaolo Bonzini * GNU General Public License for more details. 137c379526SPaolo Bonzini * 147c379526SPaolo Bonzini * You should have received a copy of the GNU General Public License 157c379526SPaolo Bonzini * along with this program. 167c379526SPaolo Bonzini * 177c379526SPaolo Bonzini * Copyright 2015 IBM Corporation 187c379526SPaolo Bonzini * Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> 197c379526SPaolo Bonzini */ 207c379526SPaolo Bonzini 217c379526SPaolo Bonzini #undef DEBUG 227c379526SPaolo Bonzini 237c379526SPaolo Bonzini #include <linux/types.h> 247c379526SPaolo Bonzini #include <linux/compiler.h> 257c379526SPaolo Bonzini #include <asm/paca.h> 267c379526SPaolo Bonzini #include <asm/hmi.h> 2792ab45c5SChristophe Leroy #include <asm/processor.h> 287c379526SPaolo Bonzini 297c379526SPaolo Bonzini void wait_for_subcore_guest_exit(void) 307c379526SPaolo Bonzini { 317c379526SPaolo Bonzini int i; 327c379526SPaolo Bonzini 337c379526SPaolo Bonzini /* 347c379526SPaolo Bonzini * NULL bitmap pointer indicates that KVM module hasn't 357c379526SPaolo Bonzini * been loaded yet and hence no guests are running. 367c379526SPaolo Bonzini * If no KVM is in use, no need to co-ordinate among threads 377c379526SPaolo Bonzini * as all of them will always be in host and no one is going 387c379526SPaolo Bonzini * to modify TB other than the opal hmi handler. 397c379526SPaolo Bonzini * Hence, just return from here. 407c379526SPaolo Bonzini */ 417c379526SPaolo Bonzini if (!local_paca->sibling_subcore_state) 427c379526SPaolo Bonzini return; 437c379526SPaolo Bonzini 447c379526SPaolo Bonzini for (i = 0; i < MAX_SUBCORE_PER_CORE; i++) 457c379526SPaolo Bonzini while (local_paca->sibling_subcore_state->in_guest[i]) 467c379526SPaolo Bonzini cpu_relax(); 477c379526SPaolo Bonzini } 487c379526SPaolo Bonzini 497c379526SPaolo Bonzini void wait_for_tb_resync(void) 507c379526SPaolo Bonzini { 517c379526SPaolo Bonzini if (!local_paca->sibling_subcore_state) 527c379526SPaolo Bonzini return; 537c379526SPaolo Bonzini 547c379526SPaolo Bonzini while (test_bit(CORE_TB_RESYNC_REQ_BIT, 557c379526SPaolo Bonzini &local_paca->sibling_subcore_state->flags)) 567c379526SPaolo Bonzini cpu_relax(); 577c379526SPaolo Bonzini } 58