summaryrefslogtreecommitdiff
path: root/extra/stack_analyzer
diff options
context:
space:
mode:
authorTom Hughes <tomhughes@chromium.org>2021-01-26 10:38:55 -0800
committerCommit Bot <commit-bot@chromium.org>2021-01-28 16:38:57 +0000
commit2f40b71b625bcd826fd0cb4a005985abef0b8903 (patch)
tree1f67563e6de1dc64fd4d40bb50ea70d2a17d18a7 /extra/stack_analyzer
parent4e950b9fde9e5d7197d2558f7a36bc809e193a49 (diff)
downloadchrome-ec-2f40b71b625bcd826fd0cb4a005985abef0b8903.tar.gz
docs: Run mdformat on all .md files
BRANCH=none BUG=b:178648877 TEST=view in gitiles Signed-off-by: Tom Hughes <tomhughes@chromium.org> Change-Id: I0ac5581ba7bc512234d40dbf34222422afa9c725 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2650551 Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
Diffstat (limited to 'extra/stack_analyzer')
-rw-r--r--extra/stack_analyzer/README.md53
1 files changed, 28 insertions, 25 deletions
diff --git a/extra/stack_analyzer/README.md b/extra/stack_analyzer/README.md
index bead6d10b4..d1c77b57d2 100644
--- a/extra/stack_analyzer/README.md
+++ b/extra/stack_analyzer/README.md
@@ -1,27 +1,22 @@
-Stack Size Analysis Tool for EC Firmware
-========================================
+# Stack Size Analysis Tool for EC Firmware
This tool does static analysis on EC firmwares to get the maximum stack usage of
each function and task. The maximum stack usage of a function includes the stack
used by itself and the functions it calls.
-Usage
------
+## Usage
Make sure the firmware of your target board has been built.
-In `src/platform/ec`, run
-```
-make BOARD=${BOARD} SECTION=${SECTION} ANNOTATION=${ANNOTATION} analyzestack
-```
-The `${SECTION}` can be `RO` or `RW`. The `${ANNOTATION}` is a optional
-annotation file, see the example_annotation.yaml, by default,
-board/$BOARD/analyzestack.yaml is used.
+In `src/platform/ec`, run `make BOARD=${BOARD} SECTION=${SECTION}
+ANNOTATION=${ANNOTATION} analyzestack` The `${SECTION}` can be `RO` or `RW`. The
+`${ANNOTATION}` is a optional annotation file, see the example_annotation.yaml,
+by default, board/$BOARD/analyzestack.yaml is used.
-Output
-------
+## Output
For each task, it will output the result like below,
+
```
Task: PD_C1, Max size: 1156 (932 + 224), Allocated size: 640
Call Trace:
@@ -34,9 +29,12 @@ Call Trace:
pd_send_request_msg.lto_priv.263 (56) [common/usb_pd_protocol.c:653] 1009a0b4
-> pd_send_request_msg.lto_priv.263[common/usb_pd_protocol.c:712] 1009a22e0
```
-The `pd_task` uses 160 bytes on the stack and calls `pd_send_request_msg.lto_priv.263`.
+
+The `pd_task` uses 160 bytes on the stack and calls
+`pd_send_request_msg.lto_priv.263`.
The callsites to the next function will be shown like below,
+
```
-> pd_task[common/usb_pd_protocol.c:1808] 1008ac8a
- handle_request[common/usb_pd_protocol.c:1191]
@@ -44,37 +42,42 @@ The callsites to the next function will be shown like below,
-> pd_task[common/usb_pd_protocol.c:2672] 1008c222
-> [annotation]
```
-This means one callsite to the next function is at `usb_pd_protocol.c:798`,
-but it is inlined to the current function and you can follow the trace:
+
+This means one callsite to the next function is at `usb_pd_protocol.c:798`, but
+it is inlined to the current function and you can follow the trace:
`usb_pd_protocol.c:1808 -> usb_pd_protocol.c:1191 -> usb_pd_protocol.c:798` to
find the callsite. The second callsite is at `usb_pd_protocol.c:2672`. And the
third one is added by annotation.
The unresolved indirect callsites have the similar format to the above.
-Annotating Indirect Call
-------------------------
+## Annotating Indirect Call
To annotate an indirect call like this,
+
```
Unresolved indirect callsites:
pd_transmit
-> pd_transmit[common/usb_pd_protocol.c:407] 802c9c8
- tcpm_transmit[driver/tcpm/tcpm.h:142]
```
-It is an indirect call in the `tcpm_transmit`, which is inlined to the `pd_transmit`.
+
+It is an indirect call in the `tcpm_transmit`, which is inlined to the
+`pd_transmit`.
You can add a annotation like the below to eliminate it.
+
```
add:
tcpm_transmit[driver/tcpm/tcpm.h:142]:
- anx74xx_tcpm_transmit
```
-The source `tcpm_transmit[driver/tcpm/tcpm.h:142]` must be a full signature (function_name[path:line number]).
-So the resolver can know which indirect call you want to annotate and eliminate (even if it is inlined).
-Annotating arrays (hooks, console commands, host commands)
-----------------------------------------------------------
+The source `tcpm_transmit[driver/tcpm/tcpm.h:142]` must be a full signature
+(function_name[path:line number]). So the resolver can know which indirect call
+you want to annotate and eliminate (even if it is inlined).
+
+## Annotating arrays (hooks, console commands, host commands)
When a callsite calls a number of functions based on values from an constant
array (in `.rodata` section), one can use the following syntax:
@@ -89,8 +92,8 @@ array (in `.rodata` section), one can use the following syntax:
Where `name` is the symbol name for the start of the array (the end of the array
is `<name>_end`), stride is the array element size, and offset is the offset of
the function pointer in the structure. For example, above, `__deferred_funcs` is
-a simple array of function pointers, while `__hooks_tick` is an array of
-`struct hook_data` (size 8, pointer at offset 0):
+a simple array of function pointers, while `__hooks_tick` is an array of `struct
+hook_data` (size 8, pointer at offset 0):
```
struct hook_data {