simple.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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):
  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):
  26. out(' _simple_%(api)s(%(args)s);',
  27. api=event.api(),
  28. args=", ".join(event.args.names()))
  29. def generate_c_begin(events):
  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):
  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. out('',
  54. ' if (!trace_event_get_state(%(event_id)s)) {',
  55. ' return;',
  56. ' }',
  57. '',
  58. ' if (trace_record_start(&rec, %(event_id)s, %(size_str)s)) {',
  59. ' return; /* Trace Buffer Full, Event Dropped ! */',
  60. ' }',
  61. event_id='TRACE_' + event.name.upper(),
  62. size_str=sizestr)
  63. if len(event.args) > 0:
  64. for type_, name in event.args:
  65. # string
  66. if is_string(type_):
  67. out(' trace_record_write_str(&rec, %(name)s, arg%(name)s_len);',
  68. name=name)
  69. # pointer var (not string)
  70. elif type_.endswith('*'):
  71. out(' trace_record_write_u64(&rec, (uintptr_t)(uint64_t *)%(name)s);',
  72. name=name)
  73. # primitive data type
  74. else:
  75. out(' trace_record_write_u64(&rec, (uint64_t)%(name)s);',
  76. name=name)
  77. out(' trace_record_finish(&rec);',
  78. '}',
  79. '')