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> 277c379526SPaolo Bonzini 287c379526SPaolo Bonzini void wait_for_subcore_guest_exit(void) 297c379526SPaolo Bonzini { 307c379526SPaolo Bonzini int i; 317c379526SPaolo Bonzini 327c379526SPaolo Bonzini /* 337c379526SPaolo Bonzini * NULL bitmap pointer indicates that KVM module hasn't 347c379526SPaolo Bonzini * been loaded yet and hence no guests are running. 357c379526SPaolo Bonzini * If no KVM is in use, no need to co-ordinate among threads 367c379526SPaolo Bonzini * as all of them will always be in host and no one is going 377c379526SPaolo Bonzini * to modify TB other than the opal hmi handler. 387c379526SPaolo Bonzini * Hence, just return from here. 397c379526SPaolo Bonzini */ 407c379526SPaolo Bonzini if (!local_paca->sibling_subcore_state) 417c379526SPaolo Bonzini return; 427c379526SPaolo Bonzini 437c379526SPaolo Bonzini for (i = 0; i < MAX_SUBCORE_PER_CORE; i++) 447c379526SPaolo Bonzini while (local_paca->sibling_subcore_state->in_guest[i]) 457c379526SPaolo Bonzini cpu_relax(); 467c379526SPaolo Bonzini } 477c379526SPaolo Bonzini 487c379526SPaolo Bonzini void wait_for_tb_resync(void) 497c379526SPaolo Bonzini { 507c379526SPaolo Bonzini if (!local_paca->sibling_subcore_state) 517c379526SPaolo Bonzini return; 527c379526SPaolo Bonzini 537c379526SPaolo Bonzini while (test_bit(CORE_TB_RESYNC_REQ_BIT, 547c379526SPaolo Bonzini &local_paca->sibling_subcore_state->flags)) 557c379526SPaolo Bonzini cpu_relax(); 567c379526SPaolo Bonzini } 57