# Domain for atrace process.
# It is spawned either by traced_probes or by init for the boottrace service.

type atrace_exec, exec_type, file_type, system_file_type;

# boottrace services uses /data/misc/boottrace/categories
allow atrace boottrace_data_file:dir search;
allow atrace boottrace_data_file:file r_file_perms;

# Allow atrace to access tracefs.
allow atrace debugfs_tracing:dir r_dir_perms;
allow atrace debugfs_tracing:file rw_file_perms;
allow atrace debugfs_trace_marker:file getattr;

# Allow atrace to write data when a pipe is used for stdout/stderr.
# This is used by Perfetto to capture atrace stdout/stderr.
allow atrace traced_probes:fd use;
allow atrace traced_probes:fifo_file { getattr write };

# atrace sets debug.atrace.* properties
set_prop(atrace, debug_prop)

# atrace pokes all the binder-enabled processes at startup with a
# SYSPROPS_TRANSACTION, to tell them to reload the debug.atrace.* properties.

# Allow discovery of binder services.
allow atrace {
  service_manager_type
  -apex_service
  -dnsresolver_service
  -dumpstate_service
  -incident_service
  -installd_service
  -iorapd_service
  -lpdump_service
  -mdns_service
  -netd_service
  -stats_service
  -tracingproxy_service
  -vold_service
  -default_android_service
}:service_manager { find };
allow atrace servicemanager:service_manager list;

# Allow notifying the processes hosting specific binder services that
# trace-related system properties have changed.
binder_use(atrace)
allow atrace surfaceflinger:binder call;
allow atrace system_server:binder call;
allow atrace cameraserver:binder call;

# Similarly, on debug builds, allow specific HALs to be notified that
# trace-related system properties have changed.
userdebug_or_eng(`
  # List HAL interfaces.
  allow atrace hwservicemanager:hwservice_manager list;
  # Notify the camera HAL.
  hal_client_domain(atrace, hal_camera)
  hal_client_domain(atrace, hal_vibrator)
')

# Remove logspam from notification attempts to non-allowlisted services.
dontaudit atrace hwservice_manager_type:hwservice_manager find;
dontaudit atrace service_manager_type:service_manager find;
dontaudit atrace domain:binder call;

# atrace can call atrace HAL
hal_client_domain(atrace, hal_atrace)

get_prop(atrace, hwservicemanager_prop)

userdebug_or_eng(`
  # atrace is generally invoked as a standalone binary from shell or perf
  # daemons like Perfetto traced_probes. However, in userdebug builds, there is
  # a further option to run atrace as an init daemon for boot tracing.
  init_daemon_domain(atrace)

  allow atrace debugfs_tracing_debug:dir r_dir_perms;
  allow atrace debugfs_tracing_debug:file rw_file_perms;
')
