aboutsummaryrefslogtreecommitdiff
path: root/src/rtos
diff options
context:
space:
mode:
authorErhan Kurubas <erhan.kurubas@espressif.com>2023-01-21 20:23:07 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2023-01-28 15:51:15 +0000
commitcf50bcb841238726697dc1250d6b6cb49fc6d19d (patch)
treec711ed1dd3199f069a9d96882155f3659d99667e /src/rtos
parent59bc761d56f9ce9a76c917e267a2c37f1a680611 (diff)
downloadriscv-openocd-cf50bcb841238726697dc1250d6b6cb49fc6d19d.zip
riscv-openocd-cf50bcb841238726697dc1250d6b6cb49fc6d19d.tar.gz
riscv-openocd-cf50bcb841238726697dc1250d6b6cb49fc6d19d.tar.bz2
rtos/nuttx: add stacking info for Espressif Xtensa chips
ESP32, ESP32-S2 and ESP32-S3 stack register offsets added Signed-off-by: Erhan Kurubas <erhan.kurubas@espressif.com> Change-Id: Ic6215c1d0152853fd08f82cbd3c138c7d62dbc46 Reviewed-on: https://review.openocd.org/c/openocd/+/7443 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Diffstat (limited to 'src/rtos')
-rw-r--r--src/rtos/rtos_nuttx_stackings.c358
1 files changed, 358 insertions, 0 deletions
diff --git a/src/rtos/rtos_nuttx_stackings.c b/src/rtos/rtos_nuttx_stackings.c
index b59b135..b70cccb 100644
--- a/src/rtos/rtos_nuttx_stackings.c
+++ b/src/rtos/rtos_nuttx_stackings.c
@@ -108,3 +108,361 @@ const struct rtos_register_stacking nuttx_riscv_stacking = {
.calculate_process_stack = rtos_generic_stack_align8,
.register_offsets = nuttx_stack_offsets_riscv,
};
+
+static int nuttx_esp_xtensa_stack_read(struct target *target,
+ int64_t stack_ptr, const struct rtos_register_stacking *stacking,
+ uint8_t *stack_data)
+{
+ int retval = target_read_buffer(target, stack_ptr, stacking->stack_registers_size, stack_data);
+ if (retval != ERROR_OK)
+ return retval;
+
+ stack_data[4] &= ~0x10; /* Clear exception bit in PS */
+
+ return ERROR_OK;
+}
+
+static const struct stack_register_offset nuttx_stack_offsets_esp32[] = {
+ { 0, 0x00, 32 }, /* PC */
+ { 1, 0x08, 32 }, /* A0 */
+ { 2, 0x0c, 32 }, /* A1 */
+ { 3, 0x10, 32 }, /* A2 */
+ { 4, 0x14, 32 }, /* A3 */
+ { 5, 0x18, 32 }, /* A4 */
+ { 6, 0x1c, 32 }, /* A5 */
+ { 7, 0x20, 32 }, /* A6 */
+ { 8, 0x24, 32 }, /* A7 */
+ { 9, 0x28, 32 }, /* A8 */
+ { 10, 0x2c, 32 }, /* A9 */
+ { 11, 0x30, 32 }, /* A10 */
+ { 12, 0x34, 32 }, /* A11 */
+ { 13, 0x38, 32 }, /* A12 */
+ { 14, 0x3c, 32 }, /* A13 */
+ { 15, 0x40, 32 }, /* A14 */
+ { 16, 0x44, 32 }, /* A15 */
+ /* A16-A63 aren't in the stack frame because they've been flushed to the stack earlier */
+ { 17, -1, 32 }, /* A16 */
+ { 18, -1, 32 }, /* A17 */
+ { 19, -1, 32 }, /* A18 */
+ { 20, -1, 32 }, /* A19 */
+ { 21, -1, 32 }, /* A20 */
+ { 22, -1, 32 }, /* A21 */
+ { 23, -1, 32 }, /* A22 */
+ { 24, -1, 32 }, /* A23 */
+ { 25, -1, 32 }, /* A24 */
+ { 26, -1, 32 }, /* A25 */
+ { 27, -1, 32 }, /* A26 */
+ { 28, -1, 32 }, /* A27 */
+ { 29, -1, 32 }, /* A28 */
+ { 30, -1, 32 }, /* A29 */
+ { 31, -1, 32 }, /* A30 */
+ { 32, -1, 32 }, /* A31 */
+ { 33, -1, 32 }, /* A32 */
+ { 34, -1, 32 }, /* A33 */
+ { 35, -1, 32 }, /* A34 */
+ { 36, -1, 32 }, /* A35 */
+ { 37, -1, 32 }, /* A36 */
+ { 38, -1, 32 }, /* A37 */
+ { 39, -1, 32 }, /* A38 */
+ { 40, -1, 32 }, /* A39 */
+ { 41, -1, 32 }, /* A40 */
+ { 42, -1, 32 }, /* A41 */
+ { 43, -1, 32 }, /* A42 */
+ { 44, -1, 32 }, /* A43 */
+ { 45, -1, 32 }, /* A44 */
+ { 46, -1, 32 }, /* A45 */
+ { 47, -1, 32 }, /* A46 */
+ { 48, -1, 32 }, /* A47 */
+ { 49, -1, 32 }, /* A48 */
+ { 50, -1, 32 }, /* A49 */
+ { 51, -1, 32 }, /* A50 */
+ { 52, -1, 32 }, /* A51 */
+ { 53, -1, 32 }, /* A52 */
+ { 54, -1, 32 }, /* A53 */
+ { 55, -1, 32 }, /* A54 */
+ { 56, -1, 32 }, /* A55 */
+ { 57, -1, 32 }, /* A56 */
+ { 58, -1, 32 }, /* A57 */
+ { 59, -1, 32 }, /* A58 */
+ { 60, -1, 32 }, /* A59 */
+ { 61, -1, 32 }, /* A60 */
+ { 62, -1, 32 }, /* A61 */
+ { 63, -1, 32 }, /* A62 */
+ { 64, -1, 32 }, /* A63 */
+ { 65, 0x58, 32 }, /* lbeg */
+ { 66, 0x5c, 32 }, /* lend */
+ { 67, 0x60, 32 }, /* lcount */
+ { 68, 0x48, 32 }, /* SAR */
+ { 69, -1, 32 }, /* windowbase */
+ { 70, -1, 32 }, /* windowstart */
+ { 71, -1, 32 }, /* configid0 */
+ { 72, -1, 32 }, /* configid1 */
+ { 73, 0x04, 32 }, /* PS */
+ { 74, -1, 32 }, /* threadptr */
+ { 75, -1, 32 }, /* br */
+ { 76, 0x54, 32 }, /* scompare1 */
+ { 77, -1, 32 }, /* acclo */
+ { 78, -1, 32 }, /* acchi */
+ { 79, -1, 32 }, /* m0 */
+ { 80, -1, 32 }, /* m1 */
+ { 81, -1, 32 }, /* m2 */
+ { 82, -1, 32 }, /* m3 */
+ { 83, -1, 32 }, /* expstate */
+ { 84, -1, 32 }, /* f64r_lo */
+ { 85, -1, 32 }, /* f64r_hi */
+ { 86, -1, 32 }, /* f64s */
+ { 87, -1, 32 }, /* f0 */
+ { 88, -1, 32 }, /* f1 */
+ { 89, -1, 32 }, /* f2 */
+ { 90, -1, 32 }, /* f3 */
+ { 91, -1, 32 }, /* f4 */
+ { 92, -1, 32 }, /* f5 */
+ { 93, -1, 32 }, /* f6 */
+ { 94, -1, 32 }, /* f7 */
+ { 95, -1, 32 }, /* f8 */
+ { 96, -1, 32 }, /* f9 */
+ { 97, -1, 32 }, /* f10 */
+ { 98, -1, 32 }, /* f11 */
+ { 99, -1, 32 }, /* f12 */
+ { 100, -1, 32 }, /* f13 */
+ { 101, -1, 32 }, /* f14 */
+ { 102, -1, 32 }, /* f15 */
+ { 103, -1, 32 }, /* fcr */
+ { 104, -1, 32 }, /* fsr */
+};
+
+const struct rtos_register_stacking nuttx_esp32_stacking = {
+ .stack_registers_size = 26 * 4,
+ .stack_growth_direction = -1,
+ .num_output_registers = ARRAY_SIZE(nuttx_stack_offsets_esp32),
+ .calculate_process_stack = rtos_generic_stack_align8,
+ .register_offsets = nuttx_stack_offsets_esp32,
+ .read_stack = nuttx_esp_xtensa_stack_read,
+};
+
+static const struct stack_register_offset nuttx_stack_offsets_esp32s2[] = {
+ { 0, 0x00, 32 }, /* PC */
+ { 1, 0x08, 32 }, /* A0 */
+ { 2, 0x0c, 32 }, /* A1 */
+ { 3, 0x10, 32 }, /* A2 */
+ { 4, 0x14, 32 }, /* A3 */
+ { 5, 0x18, 32 }, /* A4 */
+ { 6, 0x1c, 32 }, /* A5 */
+ { 7, 0x20, 32 }, /* A6 */
+ { 8, 0x24, 32 }, /* A7 */
+ { 9, 0x28, 32 }, /* A8 */
+ { 10, 0x2c, 32 }, /* A9 */
+ { 11, 0x30, 32 }, /* A10 */
+ { 12, 0x34, 32 }, /* A11 */
+ { 13, 0x38, 32 }, /* A12 */
+ { 14, 0x3c, 32 }, /* A13 */
+ { 15, 0x40, 32 }, /* A14 */
+ { 16, 0x44, 32 }, /* A15 */
+ /* A16-A63 aren't in the stack frame because they've been flushed to the stack earlier */
+ { 17, -1, 32 }, /* A16 */
+ { 18, -1, 32 }, /* A17 */
+ { 19, -1, 32 }, /* A18 */
+ { 20, -1, 32 }, /* A19 */
+ { 21, -1, 32 }, /* A20 */
+ { 22, -1, 32 }, /* A21 */
+ { 23, -1, 32 }, /* A22 */
+ { 24, -1, 32 }, /* A23 */
+ { 25, -1, 32 }, /* A24 */
+ { 26, -1, 32 }, /* A25 */
+ { 27, -1, 32 }, /* A26 */
+ { 28, -1, 32 }, /* A27 */
+ { 29, -1, 32 }, /* A28 */
+ { 30, -1, 32 }, /* A29 */
+ { 31, -1, 32 }, /* A30 */
+ { 32, -1, 32 }, /* A31 */
+ { 33, -1, 32 }, /* A32 */
+ { 34, -1, 32 }, /* A33 */
+ { 35, -1, 32 }, /* A34 */
+ { 36, -1, 32 }, /* A35 */
+ { 37, -1, 32 }, /* A36 */
+ { 38, -1, 32 }, /* A37 */
+ { 39, -1, 32 }, /* A38 */
+ { 40, -1, 32 }, /* A39 */
+ { 41, -1, 32 }, /* A40 */
+ { 42, -1, 32 }, /* A41 */
+ { 43, -1, 32 }, /* A42 */
+ { 44, -1, 32 }, /* A43 */
+ { 45, -1, 32 }, /* A44 */
+ { 46, -1, 32 }, /* A45 */
+ { 47, -1, 32 }, /* A46 */
+ { 48, -1, 32 }, /* A47 */
+ { 49, -1, 32 }, /* A48 */
+ { 50, -1, 32 }, /* A49 */
+ { 51, -1, 32 }, /* A50 */
+ { 52, -1, 32 }, /* A51 */
+ { 53, -1, 32 }, /* A52 */
+ { 54, -1, 32 }, /* A53 */
+ { 55, -1, 32 }, /* A54 */
+ { 56, -1, 32 }, /* A55 */
+ { 57, -1, 32 }, /* A56 */
+ { 58, -1, 32 }, /* A57 */
+ { 59, -1, 32 }, /* A58 */
+ { 60, -1, 32 }, /* A59 */
+ { 61, -1, 32 }, /* A60 */
+ { 62, -1, 32 }, /* A61 */
+ { 63, -1, 32 }, /* A62 */
+ { 64, -1, 32 }, /* A63 */
+ { 65, 0x48, 32 }, /* SAR */
+ { 66, -1, 32 }, /* windowbase */
+ { 67, -1, 32 }, /* windowstart */
+ { 68, -1, 32 }, /* configid0 */
+ { 69, -1, 32 }, /* configid1 */
+ { 70, 0x04, 32 }, /* PS */
+ { 71, -1, 32 }, /* threadptr */
+ { 72, -1, 32 }, /* gpio_out */
+};
+
+const struct rtos_register_stacking nuttx_esp32s2_stacking = {
+ .stack_registers_size = 25 * 4,
+ .stack_growth_direction = -1,
+ .num_output_registers = ARRAY_SIZE(nuttx_stack_offsets_esp32s2),
+ .calculate_process_stack = rtos_generic_stack_align8,
+ .register_offsets = nuttx_stack_offsets_esp32s2,
+ .read_stack = nuttx_esp_xtensa_stack_read,
+};
+
+static const struct stack_register_offset nuttx_stack_offsets_esp32s3[] = {
+ { 0, 0x00, 32 }, /* PC */
+ { 1, 0x08, 32 }, /* A0 */
+ { 2, 0x0c, 32 }, /* A1 */
+ { 3, 0x10, 32 }, /* A2 */
+ { 4, 0x14, 32 }, /* A3 */
+ { 5, 0x18, 32 }, /* A4 */
+ { 6, 0x1c, 32 }, /* A5 */
+ { 7, 0x20, 32 }, /* A6 */
+ { 8, 0x24, 32 }, /* A7 */
+ { 9, 0x28, 32 }, /* A8 */
+ { 10, 0x2c, 32 }, /* A9 */
+ { 11, 0x30, 32 }, /* A10 */
+ { 12, 0x34, 32 }, /* A11 */
+ { 13, 0x38, 32 }, /* A12 */
+ { 14, 0x3c, 32 }, /* A13 */
+ { 15, 0x40, 32 }, /* A14 */
+ { 16, 0x44, 32 }, /* A15 */
+ /* A16-A63 aren't in the stack frame because they've been flushed to the stack earlier */
+ { 17, -1, 32 }, /* A16 */
+ { 18, -1, 32 }, /* A17 */
+ { 19, -1, 32 }, /* A18 */
+ { 20, -1, 32 }, /* A19 */
+ { 21, -1, 32 }, /* A20 */
+ { 22, -1, 32 }, /* A21 */
+ { 23, -1, 32 }, /* A22 */
+ { 24, -1, 32 }, /* A23 */
+ { 25, -1, 32 }, /* A24 */
+ { 26, -1, 32 }, /* A25 */
+ { 27, -1, 32 }, /* A26 */
+ { 28, -1, 32 }, /* A27 */
+ { 29, -1, 32 }, /* A28 */
+ { 30, -1, 32 }, /* A29 */
+ { 31, -1, 32 }, /* A30 */
+ { 32, -1, 32 }, /* A31 */
+ { 33, -1, 32 }, /* A32 */
+ { 34, -1, 32 }, /* A33 */
+ { 35, -1, 32 }, /* A34 */
+ { 36, -1, 32 }, /* A35 */
+ { 37, -1, 32 }, /* A36 */
+ { 38, -1, 32 }, /* A37 */
+ { 39, -1, 32 }, /* A38 */
+ { 40, -1, 32 }, /* A39 */
+ { 41, -1, 32 }, /* A40 */
+ { 42, -1, 32 }, /* A41 */
+ { 43, -1, 32 }, /* A42 */
+ { 44, -1, 32 }, /* A43 */
+ { 45, -1, 32 }, /* A44 */
+ { 46, -1, 32 }, /* A45 */
+ { 47, -1, 32 }, /* A46 */
+ { 48, -1, 32 }, /* A47 */
+ { 49, -1, 32 }, /* A48 */
+ { 50, -1, 32 }, /* A49 */
+ { 51, -1, 32 }, /* A50 */
+ { 52, -1, 32 }, /* A51 */
+ { 53, -1, 32 }, /* A52 */
+ { 54, -1, 32 }, /* A53 */
+ { 55, -1, 32 }, /* A54 */
+ { 56, -1, 32 }, /* A55 */
+ { 57, -1, 32 }, /* A56 */
+ { 58, -1, 32 }, /* A57 */
+ { 59, -1, 32 }, /* A58 */
+ { 60, -1, 32 }, /* A59 */
+ { 61, -1, 32 }, /* A60 */
+ { 62, -1, 32 }, /* A61 */
+ { 63, -1, 32 }, /* A62 */
+ { 64, -1, 32 }, /* A63 */
+ { 65, 0x58, 32 }, /* lbeg */
+ { 66, 0x5c, 32 }, /* lend */
+ { 67, 0x60, 32 }, /* lcount */
+ { 68, 0x48, 32 }, /* SAR */
+ { 69, -1, 32 }, /* windowbase */
+ { 70, -1, 32 }, /* windowstart */
+ { 71, -1, 32 }, /* configid0 */
+ { 72, -1, 32 }, /* configid1 */
+ { 73, 0x04, 32 }, /* PS */
+ { 74, -1, 32 }, /* threadptr */
+ { 75, -1, 32 }, /* br */
+ { 76, 0x54, 32 }, /* scompare1 */
+ { 77, -1, 32 }, /* acclo */
+ { 78, -1, 32 }, /* acchi */
+ { 79, -1, 32 }, /* m0 */
+ { 80, -1, 32 }, /* m1 */
+ { 81, -1, 32 }, /* m2 */
+ { 82, -1, 32 }, /* m3 */
+ { 83, -1, 32 }, /* gpio_out */
+ { 84, -1, 32 }, /* f0 */
+ { 85, -1, 32 }, /* f1 */
+ { 86, -1, 32 }, /* f2 */
+ { 87, -1, 32 }, /* f3 */
+ { 88, -1, 32 }, /* f4 */
+ { 89, -1, 32 }, /* f5 */
+ { 90, -1, 32 }, /* f6 */
+ { 91, -1, 32 }, /* f7 */
+ { 92, -1, 32 }, /* f8 */
+ { 93, -1, 32 }, /* f9 */
+ { 94, -1, 32 }, /* f10 */
+ { 95, -1, 32 }, /* f11 */
+ { 96, -1, 32 }, /* f12 */
+ { 97, -1, 32 }, /* f13 */
+ { 98, -1, 32 }, /* f14 */
+ { 99, -1, 32 }, /* f15 */
+ { 100, -1, 32 }, /* fcr */
+ { 101, -1, 32 }, /* fsr */
+ { 102, -1, 32 }, /* accx_0 */
+ { 103, -1, 32 }, /* accx_1 */
+ { 104, -1, 32 }, /* qacc_h_0 */
+ { 105, -1, 32 }, /* qacc_h_1 */
+ { 106, -1, 32 }, /* qacc_h_2 */
+ { 107, -1, 32 }, /* qacc_h_3 */
+ { 108, -1, 32 }, /* qacc_h_4 */
+ { 109, -1, 32 }, /* qacc_l_0 */
+ { 110, -1, 32 }, /* qacc_l_1 */
+ { 111, -1, 32 }, /* qacc_l_2 */
+ { 112, -1, 32 }, /* qacc_l_3 */
+ { 113, -1, 32 }, /* qacc_l_4 */
+ { 114, -1, 32 }, /* sar_byte */
+ { 115, -1, 32 }, /* fft_bit_width */
+ { 116, -1, 32 }, /* ua_state_0 */
+ { 117, -1, 32 }, /* ua_state_1 */
+ { 118, -1, 32 }, /* ua_state_2 */
+ { 119, -1, 32 }, /* ua_state_3 */
+ { 120, -1, 128 }, /* q0 */
+ { 121, -1, 128 }, /* q1 */
+ { 122, -1, 128 }, /* q2 */
+ { 123, -1, 128 }, /* q3 */
+ { 124, -1, 128 }, /* q4 */
+ { 125, -1, 128 }, /* q5 */
+ { 126, -1, 128 }, /* q6 */
+ { 127, -1, 128 }, /* q7 */
+};
+
+const struct rtos_register_stacking nuttx_esp32s3_stacking = {
+ .stack_registers_size = 26 * 4,
+ .stack_growth_direction = -1,
+ .num_output_registers = ARRAY_SIZE(nuttx_stack_offsets_esp32s3),
+ .calculate_process_stack = rtos_generic_stack_align8,
+ .register_offsets = nuttx_stack_offsets_esp32s3,
+ .read_stack = nuttx_esp_xtensa_stack_read,
+};