2
0

simple.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # -*- coding: utf-8 -*-
  2. """
  3. Simple built-in backend.
  4. """
  5. __author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
  6. __copyright__ = "Copyright 2012-2017, Lluís Vilanova <vilanova@ac.upc.edu>"
  7. __license__ = "GPL version 2 or (at your option) any later version"
  8. __maintainer__ = "Stefan Hajnoczi"
  9. __email__ = "stefanha@redhat.com"
  10. from tracetool import out
  11. PUBLIC = True
  12. def is_string(arg):
  13. strtype = ('const char*', 'char*', 'const char *', 'char *')
  14. arg_strip = arg.lstrip()
  15. if arg_strip.startswith(strtype) and arg_strip.count('*') == 1:
  16. return True
  17. else:
  18. return False
  19. def generate_h_begin(events, group):
  20. for event in events:
  21. out('void _simple_%(api)s(%(args)s);',
  22. api=event.api(),
  23. args=event.args)
  24. out('')
  25. def generate_h(event, group):
  26. out(' _simple_%(api)s(%(args)s);',
  27. api=event.api(),
  28. args=", ".join(event.args.names()))
  29. def generate_h_backend_dstate(event, group):
  30. out(' trace_event_get_state_dynamic_by_id(%(event_id)s) || \\',
  31. event_id="TRACE_" + event.name.upper())
  32. def generate_c_begin(events, group):
  33. out('#include "qemu/osdep.h"',
  34. '#include "trace/control.h"',
  35. '#include "trace/simple.h"',
  36. '')
  37. def generate_c(event, group):
  38. out('void _simple_%(api)s(%(args)s)',
  39. '{',
  40. ' TraceBufferRecord rec;',
  41. api=event.api(),
  42. args=event.args)
  43. sizes = []
  44. for type_, name in event.args:
  45. if is_string(type_):
  46. out(' size_t arg%(name)s_len = %(name)s ? MIN(strlen(%(name)s), MAX_TRACE_STRLEN) : 0;',
  47. name=name)
  48. strsizeinfo = "4 + arg%s_len" % name
  49. sizes.append(strsizeinfo)
  50. else:
  51. sizes.append("8")
  52. sizestr = " + ".join(sizes)
  53. if len(event.args) == 0:
  54. sizestr = '0'
  55. event_id = 'TRACE_' + event.name.upper()
  56. if "vcpu" in event.properties:
  57. # already checked on the generic format code
  58. cond = "true"
  59. else:
  60. cond = "trace_event_get_state(%s)" % event_id
  61. out('',
  62. ' if (!%(cond)s) {',
  63. ' return;',
  64. ' }',
  65. '',
  66. ' if (trace_record_start(&rec, %(event_obj)s.id, %(size_str)s)) {',
  67. ' return; /* Trace Buffer Full, Event Dropped ! */',
  68. ' }',
  69. cond=cond,
  70. event_obj=event.api(event.QEMU_EVENT),
  71. size_str=sizestr)
  72. if len(event.args) > 0:
  73. for type_, name in event.args:
  74. # string
  75. if is_string(type_):
  76. out(' trace_record_write_str(&rec, %(name)s, arg%(name)s_len);',
  77. name=name)
  78. # pointer var (not string)
  79. elif type_.endswith('*'):
  80. out(' trace_record_write_u64(&rec, (uintptr_t)(uint64_t *)%(name)s);',
  81. name=name)
  82. # primitive data type
  83. else:
  84. out(' trace_record_write_u64(&rec, (uint64_t)%(name)s);',
  85. name=name)
  86. out(' trace_record_finish(&rec);',
  87. '}',
  88. '')