]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
trace: Reduce the number of function sites
authorSimon Glass <sjg@chromium.org>
Sun, 15 Jan 2023 21:15:47 +0000 (14:15 -0700)
committerTom Rini <trini@konsulko.com>
Sat, 11 Feb 2023 17:22:35 +0000 (12:22 -0500)
Given that the compiler adds two function calls into each function, the
current spacing is overkill. Drop it down to 16 bytes per function, which
is still plenty. This saves some space in the trace buffer.

Also move the calculation into a function, so it is common code. Add a
check for gd->mon_len being unset, which breaks tracing.

Signed-off-by: Simon Glass <sjg@chromium.org>
include/trace.h
lib/trace.c

index 2be8d81b5159ea19e8158457993670a9e7c325d3..763d6d1255a94479663adea10a3eda02e085488d 100644 (file)
@@ -17,14 +17,16 @@ enum {
         *
         * The value here assumes a minimum instruction size of 4 bytes,
         * or that instructions are 2 bytes but there are at least 2 of
-        * them in every function.
+        * them in every function. Given that each function needs a call to
+        * __cyg_profile_func_enter() and __cyg_profile_func_exit() as well,
+        * we cannot have functions smaller that 16 bytes.
         *
         * Increasing this value reduces the number of functions we can
         * resolve, but reduces the size of the uintptr_t array used for
         * our function list, which is the length of the code divided by
         * this value.
         */
-       FUNC_SITE_SIZE  = 4,    /* distance between function sites */
+       FUNC_SITE_SIZE  = 16,   /* distance between function sites */
 
        TRACE_VERSION   = 1,
 };
index 2e2c1bed54f158292ad0e740078f0e38aec6384d..12dae2089a48843b505ce8f9fdacdfb11be3d471 100644 (file)
@@ -321,6 +321,17 @@ void notrace trace_set_enabled(int enabled)
        trace_enabled = enabled != 0;
 }
 
+static int get_func_count(void)
+{
+       /* Detect no support for mon_len since this means tracing cannot work */
+       if (IS_ENABLED(CONFIG_SANDBOX) && !gd->mon_len) {
+               puts("Tracing is not supported on this board\n");
+               return -ENOTSUPP;
+       }
+
+       return gd->mon_len / FUNC_SITE_SIZE;
+}
+
 /**
  * trace_init() - initialize the tracing system and enable it
  *
@@ -330,10 +341,12 @@ void notrace trace_set_enabled(int enabled)
  */
 int notrace trace_init(void *buff, size_t buff_size)
 {
-       ulong func_count = gd->mon_len / FUNC_SITE_SIZE;
+       int func_count = get_func_count();
        size_t needed;
        int was_disabled = !trace_enabled;
 
+       if (func_count < 0)
+               return func_count;
        trace_save_gd();
 
        if (!was_disabled) {
@@ -393,10 +406,12 @@ int notrace trace_init(void *buff, size_t buff_size)
  */
 int notrace trace_early_init(void)
 {
-       ulong func_count = gd->mon_len / FUNC_SITE_SIZE;
+       int func_count = get_func_count();
        size_t buff_size = CONFIG_TRACE_EARLY_SIZE;
        size_t needed;
 
+       if (func_count < 0)
+               return func_count;
        /* We can ignore additional calls to this function */
        if (trace_enabled)
                return 0;