 3d211d9f4d
			
		
	
	
		3d211d9f4d
		
	
	
	
	
		
			
			This property identifies events that trace vCPU-specific information. It adds a "CPUState*" argument to events with the property, identifying the vCPU raising the event. TCG translation events also have a "TCGv_env" implicit argument that is later used as the "CPUState*" argument at execution time. Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> Message-id: 145641861797.30295.6991314023181842105.stgit@localhost Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
		
			
				
	
	
		
			169 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python
 | |
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| """
 | |
| Type-transformation rules.
 | |
| """
 | |
| 
 | |
| __author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
 | |
| __copyright__  = "Copyright 2012-2016, Lluís Vilanova <vilanova@ac.upc.edu>"
 | |
| __license__    = "GPL version 2 or (at your option) any later version"
 | |
| 
 | |
| __maintainer__ = "Stefan Hajnoczi"
 | |
| __email__      = "stefanha@linux.vnet.ibm.com"
 | |
| 
 | |
| 
 | |
| def _transform_type(type_, trans):
 | |
|     if isinstance(trans, str):
 | |
|         return trans
 | |
|     elif isinstance(trans, dict):
 | |
|         if type_ in trans:
 | |
|             return _transform_type(type_, trans[type_])
 | |
|         elif None in trans:
 | |
|             return _transform_type(type_, trans[None])
 | |
|         else:
 | |
|             return type_
 | |
|     elif callable(trans):
 | |
|         return trans(type_)
 | |
|     else:
 | |
|         raise ValueError("Invalid type transformation rule: %s" % trans)
 | |
| 
 | |
| 
 | |
| def transform_type(type_, *trans):
 | |
|     """Return a new type transformed according to the given rules.
 | |
| 
 | |
|     Applies each of the transformation rules in trans in order.
 | |
| 
 | |
|     If an element of trans is a string, return it.
 | |
| 
 | |
|     If an element of trans is a function, call it with type_ as its only
 | |
|     argument.
 | |
| 
 | |
|     If an element of trans is a dict, search type_ in its keys. If type_ is
 | |
|     a key, use the value as a transformation rule for type_. Otherwise, if
 | |
|     None is a key use the value as a transformation rule for type_.
 | |
| 
 | |
|     Otherwise, return type_.
 | |
| 
 | |
|     Parameters
 | |
|     ----------
 | |
|     type_ : str
 | |
|         Type to transform.
 | |
|     trans : list of function or dict
 | |
|         Type transformation rules.
 | |
|     """
 | |
|     if len(trans) == 0:
 | |
|         raise ValueError
 | |
|     res = type_
 | |
|     for t in trans:
 | |
|         res = _transform_type(res, t)
 | |
|     return res
 | |
| 
 | |
| 
 | |
| ##################################################
 | |
| # tcg -> host
 | |
| 
 | |
| def _tcg_2_host(type_):
 | |
|     if type_ == "TCGv":
 | |
|         # force a fixed-size type (target-independent)
 | |
|         return "uint64_t"
 | |
|     else:
 | |
|         return type_
 | |
| 
 | |
| TCG_2_HOST = {
 | |
|     "TCGv_i32": "uint32_t",
 | |
|     "TCGv_i64": "uint64_t",
 | |
|     "TCGv_ptr": "void *",
 | |
|     None: _tcg_2_host,
 | |
|     }
 | |
| 
 | |
| 
 | |
| ##################################################
 | |
| # host -> host compatible with tcg sizes
 | |
| 
 | |
| HOST_2_TCG_COMPAT = {
 | |
|     "uint8_t": "uint32_t",
 | |
|     }
 | |
| 
 | |
| 
 | |
| ##################################################
 | |
| # host/tcg -> tcg
 | |
| 
 | |
| def _host_2_tcg(type_):
 | |
|     if type_.startswith("TCGv"):
 | |
|         return type_
 | |
|     raise ValueError("Don't know how to translate '%s' into a TCG type\n" % type_)
 | |
| 
 | |
| HOST_2_TCG = {
 | |
|     "uint32_t": "TCGv_i32",
 | |
|     "uint64_t": "TCGv_i64",
 | |
|     "void *"  : "TCGv_ptr",
 | |
|     "CPUArchState *": "TCGv_env",
 | |
|     None: _host_2_tcg,
 | |
|     }
 | |
| 
 | |
| 
 | |
| ##################################################
 | |
| # tcg -> tcg helper definition
 | |
| 
 | |
| def _tcg_2_helper_def(type_):
 | |
|     if type_ == "TCGv":
 | |
|         return "target_ulong"
 | |
|     else:
 | |
|         return type_
 | |
| 
 | |
| TCG_2_TCG_HELPER_DEF = {
 | |
|     "TCGv_i32": "uint32_t",
 | |
|     "TCGv_i64": "uint64_t",
 | |
|     "TCGv_ptr": "void *",
 | |
|     None: _tcg_2_helper_def,
 | |
|     }
 | |
| 
 | |
| 
 | |
| ##################################################
 | |
| # tcg -> tcg helper declaration
 | |
| 
 | |
| def _tcg_2_tcg_helper_decl_error(type_):
 | |
|     raise ValueError("Don't know how to translate type '%s' into a TCG helper declaration type\n" % type_)
 | |
| 
 | |
| TCG_2_TCG_HELPER_DECL = {
 | |
|     "TCGv"    : "tl",
 | |
|     "TCGv_ptr": "ptr",
 | |
|     "TCGv_i32": "i32",
 | |
|     "TCGv_i64": "i64",
 | |
|     "TCGv_env": "env",
 | |
|     None: _tcg_2_tcg_helper_decl_error,
 | |
|     }
 | |
| 
 | |
| 
 | |
| ##################################################
 | |
| # host/tcg -> tcg temporal constant allocation
 | |
| 
 | |
| def _host_2_tcg_tmp_new(type_):
 | |
|     if type_.startswith("TCGv"):
 | |
|         return "tcg_temp_new_nop"
 | |
|     raise ValueError("Don't know how to translate type '%s' into a TCG temporal allocation" % type_)
 | |
| 
 | |
| HOST_2_TCG_TMP_NEW = {
 | |
|     "uint32_t": "tcg_const_i32",
 | |
|     "uint64_t": "tcg_const_i64",
 | |
|     "void *"  : "tcg_const_ptr",
 | |
|     None: _host_2_tcg_tmp_new,
 | |
|     }
 | |
| 
 | |
| 
 | |
| ##################################################
 | |
| # host/tcg -> tcg temporal constant deallocation
 | |
| 
 | |
| def _host_2_tcg_tmp_free(type_):
 | |
|     if type_.startswith("TCGv"):
 | |
|         return "tcg_temp_free_nop"
 | |
|     raise ValueError("Don't know how to translate type '%s' into a TCG temporal deallocation" % type_)
 | |
| 
 | |
| HOST_2_TCG_TMP_FREE = {
 | |
|     "uint32_t": "tcg_temp_free_i32",
 | |
|     "uint64_t": "tcg_temp_free_i64",
 | |
|     "void *"  : "tcg_temp_free_ptr",
 | |
|     None: _host_2_tcg_tmp_free,
 | |
|     }
 |