simple.py 3.1 KB

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