Tracing problem
I have been using CoreSight PTM component on Zynq for more than two years. I started out by programming a simple library to program these components on a “bare-metal” system (without OS). Then, I moved on Linux and Mathieu Poirier (I can't thank him enough) helped me a lot during this phase. So far, I have been tracing small portions of my applications and the amount of trace generated was not that important. I was getting the expected trace i.e. for each branch (direct or indirect), I was getting a branch address packet in my trace. Now, I started tracing the whole .text section of binaries and I am not understanding the obtained trace.
Here is how I configure Linux kernel driver (Kernel v4.9):
cd /sys/bus/coresight/devices/f889c000.ptm0
echo 1 > addr_idx
echo 0 > addr_acctype
echo 0 > addr_idx
echo 0 > addr_acctype
echo 20 > mode
echo 100e0 104b4 > addr_range # These two addresses represent the beginning and end of .text section
Then, I enable the trace sink component (either ETB or TPIU) and trace source (PTM) component.
cd /sys/bus/coresight/devices/
echo 1 > f8801000.etb/enable_sink
echo 1 > f889c000.ptm0/enable_source
Then, I run my application and stop tracing.
./application.elf
./disable # simply writes 0 to each enabled component (source and sink)
Then, I recover the
trace using dd
.
When I trace small
portions of my application, the obtained trace gives the right
behavior. I check it manually by looking at objdump
of the binary.
However, when I
trace the whole .text section of the application, the amount of
obtained trace is very small (even smaller than if I trace only
main function of the application) which is quite strange for me.
Basically, the obtained trace is going through libc functions
that call the main function and it stops while it is in libc. I
don’t understand why I am getting this strange behavior. Do you
have any ideas about what I am doing wrong.
I have attached a binary source code that I am trying to trace.
Thank you for your
help and time.
Best regards,
Muhammad