simple.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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-2014, 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. if arg.lstrip().startswith(strtype):
  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_c_begin(events, group):
  30. out('#include "qemu/osdep.h"',
  31. '#include "trace.h"',
  32. '#include "trace/control.h"',
  33. '#include "trace/simple.h"',
  34. '')
  35. def generate_c(event, group):
  36. out('void _simple_%(api)s(%(args)s)',
  37. '{',
  38. ' TraceBufferRecord rec;',
  39. api=event.api(),
  40. args=event.args)
  41. sizes = []
  42. for type_, name in event.args:
  43. if is_string(type_):
  44. out(' size_t arg%(name)s_len = %(name)s ? MIN(strlen(%(name)s), MAX_TRACE_STRLEN) : 0;',
  45. name=name)
  46. strsizeinfo = "4 + arg%s_len" % name
  47. sizes.append(strsizeinfo)
  48. else:
  49. sizes.append("8")
  50. sizestr = " + ".join(sizes)
  51. if len(event.args) == 0:
  52. sizestr = '0'
  53. event_id = 'TRACE_' + event.name.upper()
  54. if "vcpu" in event.properties:
  55. # already checked on the generic format code
  56. cond = "true"
  57. else:
  58. cond = "trace_event_get_state(%s)" % event_id
  59. out('',
  60. ' if (!%(cond)s) {',
  61. ' return;',
  62. ' }',
  63. '',
  64. ' if (trace_record_start(&rec, %(event_obj)s.id, %(size_str)s)) {',
  65. ' return; /* Trace Buffer Full, Event Dropped ! */',
  66. ' }',
  67. cond=cond,
  68. event_obj=event.api(event.QEMU_EVENT),
  69. size_str=sizestr)
  70. if len(event.args) > 0:
  71. for type_, name in event.args:
  72. # string
  73. if is_string(type_):
  74. out(' trace_record_write_str(&rec, %(name)s, arg%(name)s_len);',
  75. name=name)
  76. # pointer var (not string)
  77. elif type_.endswith('*'):
  78. out(' trace_record_write_u64(&rec, (uintptr_t)(uint64_t *)%(name)s);',
  79. name=name)
  80. # primitive data type
  81. else:
  82. out(' trace_record_write_u64(&rec, (uint64_t)%(name)s);',
  83. name=name)
  84. out(' trace_record_finish(&rec);',
  85. '}',
  86. '')