mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-12-11 16:00:50 -07:00
trace: Add 'vcpu' event property to trace guest vCPU
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>
This commit is contained in:
parent
b23197f9cf
commit
3d211d9f4d
11 changed files with 189 additions and 32 deletions
|
|
@ -6,7 +6,7 @@ trace/generated-tracers.h
|
|||
"""
|
||||
|
||||
__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
|
||||
__copyright__ = "Copyright 2012-2014, 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"
|
||||
|
|
@ -23,6 +23,7 @@ def generate(events, backend):
|
|||
'#define TRACE__GENERATED_TRACERS_H',
|
||||
'',
|
||||
'#include "qemu-common.h"',
|
||||
'#include "qemu/typedefs.h"',
|
||||
'')
|
||||
|
||||
backend.generate_begin(events)
|
||||
|
|
|
|||
|
|
@ -13,7 +13,18 @@ __maintainer__ = "Stefan Hajnoczi"
|
|||
__email__ = "stefanha@linux.vnet.ibm.com"
|
||||
|
||||
|
||||
from tracetool import out
|
||||
from tracetool import out, Arguments
|
||||
import tracetool.vcpu
|
||||
|
||||
|
||||
def vcpu_transform_args(args):
|
||||
assert len(args) == 1
|
||||
return Arguments([
|
||||
args,
|
||||
# NOTE: this name must be kept in sync with the one in "tcg_h"
|
||||
# NOTE: Current helper code uses TCGv_env (CPUArchState*)
|
||||
("TCGv_env", "__tcg_" + args.names()[0]),
|
||||
])
|
||||
|
||||
|
||||
def generate(events, backend):
|
||||
|
|
@ -35,21 +46,21 @@ def generate(events, backend):
|
|||
if "tcg-trans" not in e.properties:
|
||||
continue
|
||||
|
||||
# get the original event definition
|
||||
e = e.original
|
||||
|
||||
out('static inline void %(name_tcg)s(%(args)s)',
|
||||
'{',
|
||||
name_tcg=e.api(e.QEMU_TRACE_TCG),
|
||||
args=e.args)
|
||||
name_tcg=e.original.api(e.QEMU_TRACE_TCG),
|
||||
args=tracetool.vcpu.transform_args("tcg_h", e.original))
|
||||
|
||||
if "disable" not in e.properties:
|
||||
args_trans = e.original.event_trans.args
|
||||
args_exec = tracetool.vcpu.transform_args(
|
||||
"tcg_helper_c", e.original.event_exec, "wrapper")
|
||||
out(' %(name_trans)s(%(argnames_trans)s);',
|
||||
' gen_helper_%(name_exec)s(%(argnames_exec)s);',
|
||||
name_trans=e.event_trans.api(e.QEMU_TRACE),
|
||||
name_exec=e.event_exec.api(e.QEMU_TRACE),
|
||||
argnames_trans=", ".join(e.event_trans.args.names()),
|
||||
argnames_exec=", ".join(e.event_exec.args.names()))
|
||||
name_trans=e.original.event_trans.api(e.QEMU_TRACE),
|
||||
name_exec=e.original.event_exec.api(e.QEMU_TRACE),
|
||||
argnames_trans=", ".join(args_trans.names()),
|
||||
argnames_exec=", ".join(args_exec.names()))
|
||||
|
||||
out('}')
|
||||
|
||||
|
|
|
|||
|
|
@ -6,15 +6,38 @@ Generate trace/generated-helpers.c.
|
|||
"""
|
||||
|
||||
__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
|
||||
__copyright__ = "Copyright 2012-2014, 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"
|
||||
|
||||
|
||||
from tracetool import out
|
||||
from tracetool import Arguments, out
|
||||
from tracetool.transform import *
|
||||
import tracetool.vcpu
|
||||
|
||||
|
||||
def vcpu_transform_args(args, mode):
|
||||
assert len(args) == 1
|
||||
# NOTE: this name must be kept in sync with the one in "tcg_h"
|
||||
args = Arguments([(args.types()[0], "__tcg_" + args.names()[0])])
|
||||
if mode == "code":
|
||||
return Arguments([
|
||||
# Does cast from helper requirements to tracing types
|
||||
("CPUState *", "ENV_GET_CPU(%s)" % args.names()[0]),
|
||||
])
|
||||
else:
|
||||
args = Arguments([
|
||||
# NOTE: Current helper code uses TCGv_env (CPUArchState*)
|
||||
("CPUArchState *", args.names()[0]),
|
||||
])
|
||||
if mode == "header":
|
||||
return args
|
||||
elif mode == "wrapper":
|
||||
return args.transform(HOST_2_TCG)
|
||||
else:
|
||||
assert False
|
||||
|
||||
|
||||
def generate(events, backend):
|
||||
|
|
@ -34,18 +57,18 @@ def generate(events, backend):
|
|||
if "tcg-exec" not in e.properties:
|
||||
continue
|
||||
|
||||
# tracetool.generate always transforms types to host
|
||||
e_args = e.original.args
|
||||
e_args_api = tracetool.vcpu.transform_args(
|
||||
"tcg_helper_c", e.original, "header").transform(
|
||||
HOST_2_TCG_COMPAT, TCG_2_TCG_HELPER_DEF)
|
||||
e_args_call = tracetool.vcpu.transform_args(
|
||||
"tcg_helper_c", e, "code")
|
||||
|
||||
values = ["(%s)%s" % (t, n)
|
||||
for t, n in e.args.transform(TCG_2_TCG_HELPER_DEF)]
|
||||
|
||||
out('void %(name_tcg)s(%(args)s)',
|
||||
out('void %(name_tcg)s(%(args_api)s)',
|
||||
'{',
|
||||
' %(name)s(%(values)s);',
|
||||
' %(name)s(%(args_call)s);',
|
||||
'}',
|
||||
name_tcg="helper_%s_proxy" % e.api(),
|
||||
name=e.api(),
|
||||
args=e_args.transform(HOST_2_TCG_COMPAT, TCG_2_TCG_HELPER_DEF),
|
||||
values=", ".join(values),
|
||||
args_api=e_args_api,
|
||||
args_call=", ".join(e_args_call.casted()),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ Generate trace/generated-helpers.h.
|
|||
"""
|
||||
|
||||
__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
|
||||
__copyright__ = "Copyright 2012-2014, 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"
|
||||
|
|
@ -15,6 +15,7 @@ __email__ = "stefanha@linux.vnet.ibm.com"
|
|||
|
||||
from tracetool import out
|
||||
from tracetool.transform import *
|
||||
import tracetool.vcpu
|
||||
|
||||
|
||||
def generate(events, backend):
|
||||
|
|
@ -29,11 +30,9 @@ def generate(events, backend):
|
|||
if "tcg-exec" not in e.properties:
|
||||
continue
|
||||
|
||||
# tracetool.generate always transforms types to host
|
||||
e_args = e.original.args
|
||||
|
||||
# TCG helper proxy declaration
|
||||
fmt = "DEF_HELPER_FLAGS_%(argc)d(%(name)s, %(flags)svoid%(types)s)"
|
||||
e_args = tracetool.vcpu.transform_args("tcg_helper_c", e.original, "header")
|
||||
args = e_args.transform(HOST_2_TCG_COMPAT, HOST_2_TCG,
|
||||
TCG_2_TCG_HELPER_DECL)
|
||||
types = ", ".join(args.types())
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ Generate trace/generated-helpers-wrappers.h.
|
|||
"""
|
||||
|
||||
__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
|
||||
__copyright__ = "Copyright 2012-2014, 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"
|
||||
|
|
@ -15,6 +15,7 @@ __email__ = "stefanha@linux.vnet.ibm.com"
|
|||
|
||||
from tracetool import out
|
||||
from tracetool.transform import *
|
||||
import tracetool.vcpu
|
||||
|
||||
|
||||
def generate(events, backend):
|
||||
|
|
@ -33,7 +34,7 @@ def generate(events, backend):
|
|||
continue
|
||||
|
||||
# tracetool.generate always transforms types to host
|
||||
e_args = e.original.args
|
||||
e_args = tracetool.vcpu.transform_args("tcg_helper_c", e.original, "wrapper")
|
||||
|
||||
# mixed-type to TCG helper bridge
|
||||
args_tcg_compat = e_args.transform(HOST_2_TCG_COMPAT)
|
||||
|
|
|
|||
|
|
@ -32,4 +32,5 @@ def generate(events, backend):
|
|||
' */',
|
||||
'#pragma GCC diagnostic ignored "-Wredundant-decls"',
|
||||
'',
|
||||
'#include "qemu/typedefs.h"',
|
||||
'#include "generated-ust-provider.h"')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue