kvm: Set up signal mask also for !CONFIG_IOTHREAD
Block SIG_IPI, unblock it during KVM_RUN, just like in io-thread mode. It's unused so far, but this infrastructure will be required for self-IPIs and to process SIGBUS plus, in KVM mode, SIGIO and SIGALRM. As Windows doesn't support signal services, we need to provide a stub for the init function. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
		
							parent
							
								
									55f8d6ac3e
								
							
						
					
					
						commit
						ff48eb5fe7
					
				
							
								
								
									
										29
									
								
								cpus.c
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								cpus.c
									
									
									
									
									
								
							@ -223,11 +223,9 @@ fail:
 | 
				
			|||||||
    return err;
 | 
					    return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_IOTHREAD
 | 
					 | 
				
			||||||
static void dummy_signal(int sig)
 | 
					static void dummy_signal(int sig)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else /* _WIN32 */
 | 
					#else /* _WIN32 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -259,6 +257,32 @@ static void qemu_event_increment(void)
 | 
				
			|||||||
#endif /* _WIN32 */
 | 
					#endif /* _WIN32 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef CONFIG_IOTHREAD
 | 
					#ifndef CONFIG_IOTHREAD
 | 
				
			||||||
 | 
					static void qemu_kvm_init_cpu_signals(CPUState *env)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifndef _WIN32
 | 
				
			||||||
 | 
					    int r;
 | 
				
			||||||
 | 
					    sigset_t set;
 | 
				
			||||||
 | 
					    struct sigaction sigact;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(&sigact, 0, sizeof(sigact));
 | 
				
			||||||
 | 
					    sigact.sa_handler = dummy_signal;
 | 
				
			||||||
 | 
					    sigaction(SIG_IPI, &sigact, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sigemptyset(&set);
 | 
				
			||||||
 | 
					    sigaddset(&set, SIG_IPI);
 | 
				
			||||||
 | 
					    pthread_sigmask(SIG_BLOCK, &set, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pthread_sigmask(SIG_BLOCK, NULL, &set);
 | 
				
			||||||
 | 
					    sigdelset(&set, SIG_IPI);
 | 
				
			||||||
 | 
					    sigdelset(&set, SIGBUS);
 | 
				
			||||||
 | 
					    r = kvm_set_signal_mask(env, &set);
 | 
				
			||||||
 | 
					    if (r) {
 | 
				
			||||||
 | 
					        fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r));
 | 
				
			||||||
 | 
					        exit(1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int qemu_init_main_loop(void)
 | 
					int qemu_init_main_loop(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    cpu_set_debug_excp_handler(cpu_debug_handler);
 | 
					    cpu_set_debug_excp_handler(cpu_debug_handler);
 | 
				
			||||||
@ -284,6 +308,7 @@ void qemu_init_vcpu(void *_env)
 | 
				
			|||||||
            fprintf(stderr, "kvm_init_vcpu failed: %s\n", strerror(-r));
 | 
					            fprintf(stderr, "kvm_init_vcpu failed: %s\n", strerror(-r));
 | 
				
			||||||
            exit(1);
 | 
					            exit(1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        qemu_kvm_init_cpu_signals(env);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user