o encoding patches
summaryrefslogblamecommitdiffstats
path: root/monitor.c
blob: c09fa63940921f13bddfabcd83096e3ebaf013bf (plain) (tree)
1
2
3
4
5

               
  
                                          
  

















                                                                                
 
                       
                       
                   
                
                  
                         
                   
                       
                            
                      
                         
                    
                      
                            
                            
                             
                          
                        
                            
                             
                          
                       
                     
                                 
                        
                        
                           
                       
                            
                     
                       
                           
                            
                          
                             
                           
                                 
                           
                                  
                       
                          
                               
                          
                         
      
                        
                          
                     
                        
                
                        
                       

                               
                       
                           
                                 
                         
                        
                            
                        
                    
 

                                  
                                        

      

                   
  
                        
                                 
                                              
                                                                              




                                                                     

                                          

                                                                         
                                  



                                                                              


                                                                      

                                                            

                                                             

                                               
                                             


   
                          
                     
                          

                       
                                        



                                                                           

                                
                                                                                
            
 
                                            

                                 

               
                               

  













                                                              
                                     


                               
                
                             

                                                                      


                                                                     
       
                             

                                                                       
      

                                                  



                                                            
             
 




                                                             
                                      

                                                                         
                                                               
                                                    
                        
 



                                                                     
                
                    
                   
              
                                                                     
                    
                       


                                                          
                                                


                                                          
                      
 
                   
                        
                                                
                          
                         
                                







                                                                      
                                                         
       
                               



                                                                        

  
                               




                                                                   




                                   



                                                           
                 
               


                                     


                             
                                                                      
                              
                                            
                                       
                              
 

                                 
                                         
 
                        
 

                             
 
                                                          
 
                          
 

                                                                 
 



                                                     



                                              
   


                                                                 










                                                                     

                                                         

                                                      



                                                            


                                                                      
   


                                                 
 
                                              

 
                                                        
 


                 



                                                                    
 

                                                                    
 
                  






                                                                              

 

                                             

                            
                         


                
                                              






                                                                  



                                                    



                                                

                                               


                                                                      

                          
                                    

                              
                                      


                 
                                    
                                              
 
           


                    



                          

                                          
 
                               
                                                                      

                                                         
                                       
                                        


                     
                               
                                                      
                                       
                              
         
                                  
                            
                                                                     
                                                              
         


     

                                
                                    
                              
                                      

 
                                
                                                       
 
           
 
                                    



                      




                                                  
                                      
         
     
                                      

 
                                                               
 
              
 


               
                              
               
     
 
                                    
                           
                

 
                                                       
 

                      
                                  
               

 
                                                       


                      
                                                



               
                                                             
 
                                       

                  

                                                                           

                         

                                             
 
                        

 
                                                                        








                                                         
  


                                                                     
   
                                                                  


                 
                                                    
                                           

                                                                    
                                          



         

                                                     




                                                       
                                                                  
 
                                 
                                   
 
                                    
                                             
                                                                   
 
                                   
 
                        
                               
                                              
            
                                                                  
                                                                     




                                                                      
              
                                                                    

                                                                    
               
                                          
                                                
                
              
                                                            
                                                          
                                                                    

                                                                      
                                                                       
 
                                                  


                                                      
                                              
                                  
                                                                    


                                                                     
                                                             

         
 
                                     

 
                                                   







































                                                                  
  
                                                               

                                                   
   
                                                    
 
                                            
                                                                            
 
                                                                         
                                   
 
                         
                                                                   
 
                                                                
                                      
                              
                                                         

                                                               
                                     

                                   
     
 
                                     

 
                                                             
 
                                               
                                             
 



                                                               



                                                                      
                
 
 




                                                                       








                                                       




                                                              
                





                                                                           

 
                                                                  
 

                                        
                                                            
                                                 
 


                                         
                                    
                                    
                                              
                                

                                   
                                 
                                       
                                          



                                              
                              
                                         


                                                      
                           
                               
                                       
                                                 
                                              
                                        

 

                                                                             
 
                        
                          
 
                                         



                      

                                             

                              

                                                                       



                     
                                           

                      
                                   

                                                       

                              
     
                                     

    
                               
                  

 







                                                          
                                   








                                                              


































                                                            
                                                                   












                                               
                                            

















                                                 


























                                                                              














                                  
                      

                                            
                      
                      
         

                                      

                        




                                     

 
  
                                                   









                                                   






                                                   



                                                                         






                                                                            
                                                              
                                                                  
 
                         
             
 









                                                              


                                                      






                                                             
                   
         
     





                                                                           

 
                                                    
 






                                                            
                                    

                                                                         
                                                                  
                                                                          
             




                                                      
         
     




                                                         

 
                                                         
 
                                                    

 
                                                             


                                                       

                                                   
                            
 





                                                                                          
                    
                                    
     
 
 
                          
                                                            




















                                                                  

      
                                                           
 
                          

 
                                                            
 
                                           
 

                        

     










                                                  
                                                                          

                

 


                                             
                
 
                                             
                                                  











                                                      





                                                                      
                                                              
                                                        



                                                                  
                                                    

 
  












                                                                      
                   
                                                                   
                                                       
                                                                      
                                                                    

                    
                                                        

                  
                                                                    
      
                                                   
                                                                       

                          

                                                                        


                                                                           
                                                                   
      

 
                                           
 






                                                              
                                    
 
                                                           
                                                                    
                                                                     
                                         
                                                                     
                                         
 
                                   


                                                                           
                                                                            

 

                                         
                                              

 
                                                
 


                                                                      

 
  


                                                     
   

                                                                  
 

                                    
 
                                    
 
                                     





                                                                           
             
         
                                  

     



                                                                          

     
                                                 


                


                                                                     






                                                                          

                                                  

     
                                          

 
                                                                     
                                  
 
                  
 


                                  
     

                                                                   
             

 
                            
                                                   
 










                                                                          


                         
                                              
                        
     


                                   
               

 




                                  
                                   
 


                                   

 

                               
                                           

                                                     

 
                                                                
 

                                                                     
 













                                                                           
     

 
                 
                                                          
 




                                                                         
                                                 
                                                  

 
                                                              


                                                    
      
 










                                                                             
                                                              

          
                    
 

                 

             
                                               

                  
                                                  
            


     
                                                               
 






                                                              
 
 
                                                                   
 
                                                        

                                                   
                               
                             




                            



                                                              
 
                                                                         



                                    






                                                                                
 
 




                                                                             
 
                                         

                                      

         
                                         
                                                                      
                   

         



                                                                 
                                                   
                   
         
               

     
                                                                        

 
                                                         
 





                                                                  

 
                                                     

             
                                                      
 
                                 

                 
                                           
                    
                                 


                   
                       

 
                                                            
 
                                                            








                                                              
                                                           
 
                                                            





                                                                        
                                                    
            

                                                                          


     
                                                                 
 
                                                        




                                                                      
                                               
 
                             

               
                                   

              
                                    

              
                                   

              
                                   


                                  
                                         
                
                                              


              
                             

 
                                                                       
                                                     
 
                                         

                    





                                                          

                        
                                                         







                        



                    
                                                






                                     
                                                      






                     
                        
                                                          
            
                                                                       



                          






                                                                               
                
                                                               
                                                               

                      
         
              



                           
                                    

                      
                                    

                      
                                             

                      
                                   

                      
                                     

                            
                                                                 

                      
                                                                   

                      
                                                                

                      
                                                                

                      
                                       



                       
                                  




                  
                                                             
 




                                                    
                                                   

 
                                                                      
 


                                                
                                               
 
                                                   

 




































































































                                                                                 
                                                      
 
                                                
                                             
 

                    
                                                   

              
                                                   

              
                                                  


              
                                                  

              
                                 

              
                              

 
                                                     

                  
                 

                                                   


                                                      

                                                                       

                                                    
                   
     
                                       

 

                              
                                                            
 
                           


                                                            
 

                                 



                                                 
                                     
                      
                                                                                





                                                      

 
                                                              
 
                                               



                                                        
                                                            





                                                                            
                                      

 
                                                             
 


                                                 



                    
                                                  
                                                    






                   
                            


                     
                            


                     
                            


                     

                                                   
 
 
                                                              
 



                                            




                         
                            

              
                            

              
                            



              
                                                          
 
                            
                                                                
 

                                          
                                    
            
                                                                            


     
                                                            
 
                                                                 
                                                                           
                                                           
 

                                                                              

 
                                                           
 
          
                          
                                
 
                                            

                                                  
                                  


                                                     



                                                                          



                                                                


                                                                   
     
                                    
                     

 

                      

                 
                                                              
 






                                               
                                                            
                                                                        
                                                            

                                                                  
                 

     
                                                              
 
                                                            


      
                     
                                                                 
 
                                                              




                                                                            
                                         



                                
                                                             

          
                                      




                                                                            
                                      
                       




                   
                                                            







                                                              

                    
                                





                                                             
                                                            
                   
               
     
                                                  
 
 
                                                         
 
                                        
 
               
                                                              
     


               
                                                          
 
                                                          


                                           
 
              
                                           
                                                            
                                                    

                                                 
                                                                         
         


     
                                                           
 
                                                          


                                           

                                                        


     
                                                            
 

                                                          
                                           
 

                                           

                                                                
                                                 


                                                               

                                                                   
         

     
 
                                                         
 




                                                          










                                                                   

                   







                                                                         

     
 
                                                            
 

                                                          

                                           
 
              




                                                                           


     
                                                
 
                    
                   
 
                                              
                   
                                               
               


                                  
                  

                                                                
               

     
                                        
                                               



                                               
                           
                       
                                              
                                                           
                      
               

     

                                        

                   
                                                  
                                          

 
                                                  
 
                    
               
 
                                        
                                               



                                               
                                  
                           

                            
                                              
                                                           
                      
               

     
                                          
                                                

 
                                                                  
 
                    
 
                                    
                                           








                                               
                                  

                            
                                          



                  
                                      
                                                                              


              





                                                                                


                                                                           






                                             
                                                                           




                                      




                                        
                                      


                                                                      
                                        

 




                                                                           

                      
                                          
                   
                                               


                   



                                                             
     













                                                                           
                                      


















                                                            
                                            



               
                                        





                                                                             
                                                







                                             
                                      




























                                                                             
                                        



                      







                                                                            
                                      

















                                                                                

                                                                          
                                                    

















































                                                                
                                        


                  

                                                     


                   


                             
            
 
                                      






                                                            

                             


                                                                    

                                       

             

                      
     
                  
 



                                        






                                                          
                                      





                                                                    
                         




                                                                       
                                            

                 


                                        







                                                                    
                                      







                                                                    
                             
                        
                                                        
                                         
                 


             


                                        







                                                           
                                            
 
                                                   

 
                                                                    


                            
 
                                          
                                                     

                                   
                       

                                                                         
         



                                         
            
                         




              
                                                                    
                                

                              

  





                                                       


                                                                     
                           
 
 

                                              
 




                                  
                            

 
                                     
                                                               
 
                                                 
                                 
              

                     
 
                                   



                                   

                                          
                                                      
                    
                                                      
                                                  










                                                



                     
 
                                                 




                                  



                      
                       
              
                                  



                  
                                      
 
                                       
 
              
            
            



                  
                            


               
                             


               
                             


               
                          
                          
                                            


               


                         
                                                           


                         
                                                                

               


                              
                              
 




                                                  
                                                



                                                
                                      

                      
                                             
                        
                                                    
                    


              
                                                        


              
                  
                                 


                                                
                       
                                                                   

                
                                  






                  
                                      
 
                      
           
 
                          




                                                
                               






                        
                          
                                                    









                            
                                       
 
                      
           
 
                         




                                                
                              















                        
                                     
 
                      
           
 
                          




                                   
                               







                        
                                                                 

              
                                 


                  
                              
              
                          



              




















                                                                  

























                                                               


















                                                       
                            






                           


                                    











                                                              

                                                                          


                         
                                                      







                                              
  







                                                                      
   
                                                           
                                                                     

                                                                
 
                  
                         
                      
 
                                  
                                                          
           
                    
 
                                                
               
                                                        
                                                          
                    
     





                                                                           
 



                                            

              
                            
                                               
                                                                            

     




















                                                              

                              
             

                                              
                  
                     


                   
                 


                        
 
                                        




                                                               
                              



                                                    

                               
                                                                      
                                                  

                              
                                                                               
                                                  

                              
                                                                                

                              

                              
                                               
             
                  
















                                                          
                                                                     






                                                


                                        
 
                                        




                                      
                                           
                                  
                                                  





































                                                            
                                                          

                                                                             

                                  

                                                    



                                                                             
                                                
                     



                                                




                                                
                 


                                                       
             
                  
                 
                 
                 
             
                            
 
                                        
                        
                                                         
                                          



                                         


                                        
                                                    
                                    
                                

                                      

                         
                              
                 
                                            
                              

                                                               
                                                                          

                                                                          
                                      



                                                                        
                               
                 
                                               

                  

                 
                        
                             
                                









                                          
                                                      
                                                 


                                                          
                                               


                        
                 













                                                    
                                          








                                                  



                                                                 
                                                             

                  


                                
                         








                                                                  
                               
                                                                          
                                



                                                                    
                                                

                  

                 
                                    
                                 
                            
 


                                  
                                        
                        

                                



                                                                               
                                                          







                                         
                                        
                            
                                                         
                     
                 

                  

















                                                                
                                              
                              
                 
                                             


                         

                 
                                                                         

                      
                    
                   
     
                                              
                            

                     
                                                                             
                                  
                  
     
 
                 
 
     
                         
                


                
                                                                 
 
                 
                         
                                    
 

                                           
                                                                        


               
 

                                                        




                                                                       
               

     
                         
                         

 
                                                                            







                           
                                   





                                                                   
                                                  






                       
                                                            







                                       
                            


                                                         
                                         







                                                         
 







                         




                                                                          

                                                     


                                                                             


                                                                     
                                                              
                                                 
             
                                                   




                  





                                                     










                                                                     






















                                                                            









                                                                           
                                                  
                                                               


     
                                                                           



                       



                       







                                                                    
 
                              
                                          






                                              
                                                                           



                       



                       














                                                                            


                                                                         

                                                                          
 

                                                           


               










                                                        






















                                                                               












                                                                  
                                                          
                                                 







                                                             







                                                                              









                                                                           
                                                   

 
                                                                           



                                         


                       















                                                    














                                                                        
                                           

                                                         



         






                                                                         
                                           

                                                       
                                                                    
                                                            
                                                         










                                                  


                                                                           
                                       






                                           
                                                                          
                                                        
                                                     











                                                                        






                                                                                  





                                                                  
         
                        


     






                                                                            







                                                                  





                                              

                                                                                

          



                                                   

                                                              
     

 








                                                                      
                                                         
                                                          









                                                  








                                                                     
                                                        
                                                         






                                                  


                                                             
                         
                        


                                           
 
                                                         
                                               

                                                   
 


                                                                          
         

                                 

                     
 






























                                                                       



                                                                        

                        
          
                                               
                         
                             
 





                                
                                                                
                                                         



                                                        


                              
                                                         


                                                        

                      
         
                         
                   

         

                                  


                                                                    
         
                                      

                                                                         
         
 
                                              

                                          
                                             
                                     
                                                 


                                


                                                     
                                         
         


                                 
                                                                
                                      


                                              
                                                                

                                                   




                                                           
                  
                 
                 
                                               

                                                                        

                  



                  

 
                                                 

                                                        
                          






                                                     












                                                                         

        
                                     

 
                                         
 

                          
                                              

 
  


                                                                   
   
                                                                      
 

                 
                                                      

         
                                    
     

 
                                                                         
 
                     
               
                 
 


                      
                                                                     
 

                      
                                                             
                                              







                                                                             
     
 

                                      

 
  

                                                            



                                                                     



                                                                      
   
                                                               








                                                          
                      
                                                           

                  
                                                    

















                                                                      
                                                                   
               
                     
                 
 

                   
     
 
                       
                                                                  


                                                                   
                       
                                                                              
                                                             

                             
                                               
                            
                                            
                           

     
                      
                                                                      
                            
     


                                                                         
                                        

 
                                                                      
 

                          
                 

                        
                         
 




                                                 
 
                                                                          


                                                                 

     
                                     
                                                   
                                                                 
                                                 
                                           

                           
               

     

                                    
                     
                       
                       
 


                                                       
      



                                                                      
       

                                                                     
                             






                                                                   
                                                                  



                                                      
                                        

 
                                                                        
 
                          
 
                                                                         

 
                                                                    
 
                               
          
 

                     






                                                           
                                                     
     
 

                      
 

                                                                 
 

                          
                         
                                     
                        

 
                                 
 
                                              
                       

     
                                  
 
                             
          
                                                                    

                                                            
                                                           


                                  
             

 






                                              
                                 
 
                                              
               

     
                                                   



                                                         
                



                                         


                                          

                                                                
     
 
                                   

 
                                        
 
                                  
                        
                      
 
                                                
 
                                                     

                                                               
         

     


                                                       

 
                                                      
 
                
                          
 

                          
                                                          
                                    
                                 
                                     
                            
                       

                          





                                                                    
                                        
                                                      

                                                                      

                                 
              


     
                                                  
 

                          

                          
                                        
                         
                                          




                                      
                                                
         


                           
                              
                                                         




                                          
                                          
         
                                        
                         
                                          
              
 
                          

                                                                     
                            
                                      
                                          

                            





                                 

              

 


















                                                                    

                                       
                                                                 

 





                                   
                                      








                                                                    

 


                                                                           

                                                                            











                                                
  
                                                           


                                                                   
                                                                



                                           
                                  


     









                                                                   



                                                          

                                  


     


                                             








                                                                     
                                     




                                  






                                                       
                               
                                                        
                    




                                                                           
                                          
 
                                          
                                                     
 




                                                                           
 
                                                   
                       
                       



                                                         

                                     
 
                              
                                              

                                                                      
                                 






                                                                     

                                                                
               
                                                                           
                                                                        
                                                            





                                                                         
            
                                                                           
                                                                       
     
 
                             

 



                          
      
                                                                      
                                                                        


                                                                 


                                    
 
                                                   
                                   
                             

                                                      

                                                                        
                           
                                  
                                       


                                     
 
                                                                      

                                      



                                       

 











                                                        





                                  



                                            
                                                                     
 





                                                         





                                                                        





                                                                      
      






                                                          







                                                                      





                                                              
                                     



                                                                           
                                               
 
/*
 * QEMU monitor
 *
 * Copyright (c) 2003-2004 Fabrice Bellard
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "qemu/osdep.h"
#include "qemu/units.h"
#include <dirent.h>
#include "cpu.h"
#include "hw/hw.h"
#include "monitor/qdev.h"
#include "hw/usb.h"
#include "hw/pci/pci.h"
#include "sysemu/watchdog.h"
#include "hw/loader.h"
#include "exec/gdbstub.h"
#include "net/net.h"
#include "net/slirp.h"
#include "chardev/char-fe.h"
#include "chardev/char-io.h"
#include "chardev/char-mux.h"
#include "ui/qemu-spice.h"
#include "sysemu/numa.h"
#include "monitor/monitor.h"
#include "qemu/config-file.h"
#include "qemu/readline.h"
#include "ui/console.h"
#include "ui/input.h"
#include "sysemu/block-backend.h"
#include "audio/audio.h"
#include "disas/disas.h"
#include "sysemu/balloon.h"
#include "qemu/timer.h"
#include "sysemu/hw_accel.h"
#include "qemu/acl.h"
#include "sysemu/tpm.h"
#include "qapi/qmp/qdict.h"
#include "qapi/qmp/qerror.h"
#include "qapi/qmp/qnum.h"
#include "qapi/qmp/qstring.h"
#include "qapi/qmp/qjson.h"
#include "qapi/qmp/json-parser.h"
#include "qapi/qmp/qlist.h"
#include "qom/object_interfaces.h"
#include "trace-root.h"
#include "trace/control.h"
#include "monitor/hmp-target.h"
#ifdef CONFIG_TRACE_SIMPLE
#include "trace/simple.h"
#endif
#include "exec/memory.h"
#include "exec/exec-all.h"
#include "qemu/log.h"
#include "qemu/option.h"
#include "hmp.h"
#include "qemu/thread.h"
#include "block/qapi.h"
#include "qapi/qapi-commands.h"
#include "qapi/qapi-events.h"
#include "qapi/error.h"
#include "qapi/qmp-event.h"
#include "qapi/qapi-introspect.h"
#include "sysemu/qtest.h"
#include "sysemu/cpus.h"
#include "sysemu/iothread.h"
#include "qemu/cutils.h"
#include "tcg/tcg.h"

#if defined(TARGET_S390X)
#include "hw/s390x/storage-keys.h"
#include "hw/s390x/storage-attributes.h"
#endif

/*
 * Supported types:
 *
 * 'F'          filename
 * 'B'          block device name
 * 's'          string (accept optional quote)
 * 'S'          it just appends the rest of the string (accept optional quote)
 * 'O'          option string of the form NAME=VALUE,...
 *              parsed according to QemuOptsList given by its name
 *              Example: 'device:O' uses qemu_device_opts.
 *              Restriction: only lists with empty desc are supported
 *              TODO lift the restriction
 * 'i'          32 bit integer
 * 'l'          target long (32 or 64 bit)
 * 'M'          Non-negative target long (32 or 64 bit), in user mode the
 *              value is multiplied by 2^20 (think Mebibyte)
 * 'o'          octets (aka bytes)
 *              user mode accepts an optional E, e, P, p, T, t, G, g, M, m,
 *              K, k suffix, which multiplies the value by 2^60 for suffixes E
 *              and e, 2^50 for suffixes P and p, 2^40 for suffixes T and t,
 *              2^30 for suffixes G and g, 2^20 for M and m, 2^10 for K and k
 * 'T'          double
 *              user mode accepts an optional ms, us, ns suffix,
 *              which divides the value by 1e3, 1e6, 1e9, respectively
 * '/'          optional gdb-like print format (like "/10x")
 *
 * '?'          optional type (for all types, except '/')
 * '.'          other form of optional type (for 'i' and 'l')
 * 'b'          boolean
 *              user mode accepts "on" or "off"
 * '-'          optional parameter (eg. '-f')
 *
 */

typedef struct mon_cmd_t {
    const char *name;
    const char *args_type;
    const char *params;
    const char *help;
    const char *flags; /* p=preconfig */
    void (*cmd)(Monitor *mon, const QDict *qdict);
    /* @sub_table is a list of 2nd level of commands. If it does not exist,
     * cmd should be used. If it exists, sub_table[?].cmd should be
     * used, and cmd of 1st level plays the role of help function.
     */
    struct mon_cmd_t *sub_table;
    void (*command_completion)(ReadLineState *rs, int nb_args, const char *str);
} mon_cmd_t;

/* file descriptors passed via SCM_RIGHTS */
typedef struct mon_fd_t mon_fd_t;
struct mon_fd_t {
    char *name;
    int fd;
    QLIST_ENTRY(mon_fd_t) next;
};

/* file descriptor associated with a file descriptor set */
typedef struct MonFdsetFd MonFdsetFd;
struct MonFdsetFd {
    int fd;
    bool removed;
    char *opaque;
    QLIST_ENTRY(MonFdsetFd) next;
};

/* file descriptor set containing fds passed via SCM_RIGHTS */
typedef struct MonFdset MonFdset;
struct MonFdset {
    int64_t id;
    QLIST_HEAD(, MonFdsetFd) fds;
    QLIST_HEAD(, MonFdsetFd) dup_fds;
    QLIST_ENTRY(MonFdset) next;
};

typedef struct {
    JSONMessageParser parser;
    /*
     * When a client connects, we're in capabilities negotiation mode.
     * @commands is &qmp_cap_negotiation_commands then.  When command
     * qmp_capabilities succeeds, we go into command mode, and
     * @command becomes &qmp_commands.
     */
    QmpCommandList *commands;
    bool capab_offered[QMP_CAPABILITY__MAX]; /* capabilities offered */
    bool capab[QMP_CAPABILITY__MAX];         /* offered and accepted */
    /*
     * Protects qmp request/response queue.
     * Take monitor_lock first when you need both.
     */
    QemuMutex qmp_queue_lock;
    /* Input queue that holds all the parsed QMP requests */
    GQueue *qmp_requests;
} MonitorQMP;

/*
 * To prevent flooding clients, events can be throttled. The
 * throttling is calculated globally, rather than per-Monitor
 * instance.
 */
typedef struct MonitorQAPIEventState {
    QAPIEvent event;    /* Throttling state for this event type and... */
    QDict *data;        /* ... data, see qapi_event_throttle_equal() */
    QEMUTimer *timer;   /* Timer for handling delayed events */
    QDict *qdict;       /* Delayed event (if any) */
} MonitorQAPIEventState;

typedef struct {
    int64_t rate;       /* Minimum time (in ns) between two events */
} MonitorQAPIEventConf;

struct Monitor {
    CharBackend chr;
    int reset_seen;
    int flags;
    int suspend_cnt;            /* Needs to be accessed atomically */
    bool skip_flush;
    bool use_io_thread;

    /*
     * State used only in the thread "owning" the monitor.
     * If @use_io_thread, this is @mon_iothread.
     * Else, it's the main thread.
     * These members can be safely accessed without locks.
     */
    ReadLineState *rs;

    MonitorQMP qmp;
    gchar *mon_cpu_path;
    BlockCompletionFunc *password_completion_cb;
    void *password_opaque;
    mon_cmd_t *cmd_table;
    QTAILQ_ENTRY(Monitor) entry;

    /*
     * The per-monitor lock. We can't access guest memory when holding
     * the lock.
     */
    QemuMutex mon_lock;

    /*
     * Members that are protected by the per-monitor lock
     */
    QLIST_HEAD(, mon_fd_t) fds;
    QString *outbuf;
    guint out_watch;
    /* Read under either BQL or mon_lock, written with BQL+mon_lock.  */
    int mux_out;
};

/* Shared monitor I/O thread */
IOThread *mon_iothread;

/* Bottom half to dispatch the requests received from I/O thread */
QEMUBH *qmp_dispatcher_bh;

struct QMPRequest {
    /* Owner of the request */
    Monitor *mon;
    /* "id" field of the request */
    QObject *id;
    /*
     * Request object to be handled or Error to be reported
     * (exactly one of them is non-null)
     */
    QObject *req;
    Error *err;
};
typedef struct QMPRequest QMPRequest;

/* QMP checker flags */
#define QMP_ACCEPT_UNKNOWNS 1

/* Protects mon_list, monitor_qapi_event_state, monitor_destroyed.  */
static QemuMutex monitor_lock;
static GHashTable *monitor_qapi_event_state;
static QTAILQ_HEAD(, Monitor) mon_list;
static bool monitor_destroyed;

/* Protects mon_fdsets */
static QemuMutex mon_fdsets_lock;
static QLIST_HEAD(, MonFdset) mon_fdsets;

static int mon_refcount;

static mon_cmd_t mon_cmds[];
static mon_cmd_t info_cmds[];

QmpCommandList qmp_commands, qmp_cap_negotiation_commands;

__thread Monitor *cur_mon;

static void monitor_command_cb(void *opaque, const char *cmdline,
                               void *readline_opaque);

/**
 * Is @mon a QMP monitor?
 */
static inline bool monitor_is_qmp(const Monitor *mon)
{
    return (mon->flags & MONITOR_USE_CONTROL);
}

/**
 * Is @mon is using readline?
 * Note: not all HMP monitors use readline, e.g., gdbserver has a
 * non-interactive HMP monitor, so readline is not used there.
 */
static inline bool monitor_uses_readline(const Monitor *mon)
{
    return mon->flags & MONITOR_USE_READLINE;
}

static inline bool monitor_is_hmp_non_interactive(const Monitor *mon)
{
    return !monitor_is_qmp(mon) && !monitor_uses_readline(mon);
}

/*
 * Return the clock to use for recording an event's time.
 * It's QEMU_CLOCK_REALTIME, except for qtests it's
 * QEMU_CLOCK_VIRTUAL, to support testing rate limits.
 * Beware: result is invalid before configure_accelerator().
 */
static inline QEMUClockType monitor_get_event_clock(void)
{
    return qtest_enabled() ? QEMU_CLOCK_VIRTUAL : QEMU_CLOCK_REALTIME;
}

/**
 * Is the current monitor, if any, a QMP monitor?
 */
bool monitor_cur_is_qmp(void)
{
    return cur_mon && monitor_is_qmp(cur_mon);
}

void monitor_read_command(Monitor *mon, int show_prompt)
{
    if (!mon->rs)
        return;

    readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
    if (show_prompt)
        readline_show_prompt(mon->rs);
}

int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
                          void *opaque)
{
    if (mon->rs) {
        readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
        /* prompt is printed on return from the command handler */
        return 0;
    } else {
        monitor_printf(mon, "terminal does not support password prompting\n");
        return -ENOTTY;
    }
}

static void qmp_request_free(QMPRequest *req)
{
    qobject_unref(req->id);
    qobject_unref(req->req);
    error_free(req->err);
    g_free(req);
}

/* Caller must hold mon->qmp.qmp_queue_lock */
static void monitor_qmp_cleanup_req_queue_locked(Monitor *mon)
{
    while (!g_queue_is_empty(mon->qmp.qmp_requests)) {
        qmp_request_free(g_queue_pop_head(mon->qmp.qmp_requests));
    }
}

static void monitor_qmp_cleanup_queues(Monitor *mon)
{
    qemu_mutex_lock(&mon->qmp.qmp_queue_lock);
    monitor_qmp_cleanup_req_queue_locked(mon);
    qemu_mutex_unlock(&mon->qmp.qmp_queue_lock);
}


static void monitor_flush_locked(Monitor *mon);

static gboolean monitor_unblocked(GIOChannel *chan, GIOCondition cond,
                                  void *opaque)
{
    Monitor *mon = opaque;

    qemu_mutex_lock(&mon->mon_lock);
    mon->out_watch = 0;
    monitor_flush_locked(mon);
    qemu_mutex_unlock(&mon->mon_lock);
    return FALSE;
}

/* Caller must hold mon->mon_lock */
static void monitor_flush_locked(Monitor *mon)
{
    int rc;
    size_t len;
    const char *buf;

    if (mon->skip_flush) {
        return;
    }

    buf = qstring_get_str(mon->outbuf);
    len = qstring_get_length(mon->outbuf);

    if (len && !mon->mux_out) {
        rc = qemu_chr_fe_write(&mon->chr, (const uint8_t *) buf, len);
        if ((rc < 0 && errno != EAGAIN) || (rc == len)) {
            /* all flushed or error */
            qobject_unref(mon->outbuf);
            mon->outbuf = qstring_new();
            return;
        }
        if (rc > 0) {
            /* partial write */