Skip to content

Commit 6440901

Browse files
gerekonAndrei Gramakov
authored andcommitted
semihosting: integration with the existing OpenOCD semihosting implementation
* old implementation now is version 0, native OOCD's is verison 1. * added jobs to run tests for specific IDF version * refactoring For openocd's semihosting: * added a custom read/write fields implementation * added a custom semihosting->get_filename for a custom implementation
1 parent 8d7a958 commit 6440901

18 files changed

+688
-288
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,9 @@ TAGS
9999

100100
# ctags tag files
101101
tags
102+
103+
#temp file
104+
*.bak
105+
*.old
106+
temp/**
107+

.gitlab-ci.yml

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,16 @@ variables:
134134
.finish_test_app_build: &finish_test_app_build |
135135
export UT_APP_DIR=$PWD
136136
mkdir -p $UT_APP_DIR/gcov_data
137-
pushd $UT_APP_DIR/builds/gcov_dual
138-
find . -type d -exec mkdir -p $UT_APP_DIR/gcov_data/gcov_dual/\{\} \;
139-
popd
140-
pushd $UT_APP_DIR/builds/gcov_single
141-
find . -type d -exec mkdir -p $UT_APP_DIR/gcov_data/gcov_single/\{\} \;
142-
popd
137+
if [ -d "$UT_APP_DIR/builds/gcov_dual" ]; then
138+
pushd $UT_APP_DIR/builds/gcov_dual
139+
find . -type d -exec mkdir -p $UT_APP_DIR/gcov_data/gcov_dual/\{\} \;
140+
popd
141+
fi
142+
if [ -d "$UT_APP_DIR/builds/gcov_single" ]; then
143+
pushd $UT_APP_DIR/builds/gcov_single
144+
find . -type d -exec mkdir -p $UT_APP_DIR/gcov_data/gcov_single/\{\} \;
145+
popd
146+
fi
143147
echo "export OPENOCD_GCOV_PREFIX=$UT_APP_DIR/gcov_data" > $UT_APP_DIR/gcov_data/gcov_env.sh
144148
export PREFIX_STRIP=$(awk -F"/" '{print NF-1}' <<< $UT_APP_DIR/builds)
145149
echo "export OPENOCD_GCOV_PREFIX_STRIP=$PREFIX_STRIP" >> $UT_APP_DIR/gcov_data/gcov_env.sh
@@ -173,6 +177,19 @@ variables:
173177
- *finish_test_app_build
174178
- *prepare_espytrace_package
175179

180+
.do_build_test_app: &do_build_test_app |
181+
if [ -z "$TEST_APP_CONFIGS" ]; then
182+
echo "Build ALL"
183+
$IDF_PATH/tools/idf.py -D IDF_TARGET=esp32 ut-build-all-configs
184+
else
185+
for cfg_name in $TEST_APP_CONFIGS
186+
do
187+
echo "Build <${cfg_name}>"
188+
$IDF_PATH/tools/idf.py ut-apply-config-$cfg_name
189+
$IDF_PATH/tools/idf.py ut-build-$cfg_name
190+
done
191+
fi
192+
176193
.build_test_app_template: &build_test_app_template
177194
stage: build
178195
image: $CI_DOCKER_REGISTRY/esp32-ci-env
@@ -200,7 +217,7 @@ variables:
200217
# in the image and `export.sh` fails w/o adding tools to $PATH
201218
- idf_exports=$(${IDF_PATH}/tools/idf_tools.py export) || true
202219
- eval "${idf_exports}"
203-
- $IDF_PATH/tools/idf.py -D IDF_TARGET=esp32 ut-build-all-configs
220+
- *do_build_test_app
204221
- *finish_test_app_build
205222
- *prepare_espytrace_package
206223

@@ -393,14 +410,24 @@ build_test_app:
393410
<<: *build_test_app_template
394411
variables:
395412
BUILD_TEST_APP_DIR: "build_test_app"
413+
TEST_APP_CONFIGS: ""
396414
TEST_APP_IDF_TAG: $CI_COMMIT_REF_NAME
397415
UT_GET_IDF_VER: "0"
398416

399417
build_test_app_legacy_idf_release:
400418
<<: *build_legacy_test_app_template
401419
variables:
402420
BUILD_TEST_APP_DIR: "build_test_app_legacy_idf_release"
403-
TEST_APP_IDF_TAG: "release/v$TEST_APP_LEGACY_IDF_RELEASE_TAG"
421+
TEST_APP_CONFIGS: ""
422+
TEST_APP_IDF_TAG: "v$TEST_APP_LEGACY_IDF_RELEASE_TAG"
423+
UT_GET_IDF_VER: "1"
424+
425+
build_test_app_custom_idf_release:
426+
<<: *build_test_app_template
427+
variables:
428+
BUILD_TEST_APP_DIR: "build_test_app_custom_idf_release"
429+
TEST_APP_CONFIGS: "default single_core"
430+
TEST_APP_IDF_TAG: "v$TEST_APP_CUSTOM_IDF_RELEASE_TAG"
404431
UT_GET_IDF_VER: "1"
405432

406433
tests_linux64:
@@ -427,6 +454,19 @@ tests_linux64_legacy_idf_release:
427454
TEST_RUN_DIR: "build_test_app_legacy_idf_release"
428455
TEST_RUN_EXTRA_OPTS: "-i $TEST_APP_LEGACY_IDF_RELEASE_TAG -b esp32-wrover-kit-3.3v"
429456

457+
tests_linux64_custom_idf_release:
458+
<<: *tests_linux_template
459+
tags:
460+
- test_jtag
461+
dependencies:
462+
- build_test_app_custom_idf_release
463+
- build_linux
464+
variables:
465+
PLATFORM_NAME: "linux64"
466+
TEST_RUN_DIR: "build_test_app_custom_idf_release"
467+
# currently we need to run semihost test on IDF with old semihost driver
468+
TEST_RUN_EXTRA_OPTS: "-i $TEST_APP_CUSTOM_IDF_RELEASE_TAG -b esp32-wrover-kit-3.3v -p test_semihost"
469+
430470
tests_armel:
431471
stage: test
432472
image: $CI_DOCKER_REGISTRY/rpi-esp-idf-env:1

src/target/Makefile.am

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,10 @@ XTENSA_SRC= \
142142
%D%/xtensa_debug_module.c \
143143
%D%/xtensa_algorithm.c \
144144
%D%/xtensa_mcore.c \
145+
%D%/xtensa_semihosting.c \
145146
%D%/esp_xtensa.c \
146-
%D%/esp_xtensa_apptrace.c
147+
%D%/esp_xtensa_apptrace.c \
148+
%D%/esp_xtensa_semihosting.c
147149

148150
ESP32_SRC= \
149151
%D%/esp32.c \

src/target/esp32.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,20 @@ static bool esp32_on_halt(struct target *target)
516516
if (ret != ERROR_OK)
517517
return false;
518518
/* do some stuff generic for ESP Xtensa (semihosting) */
519-
return esp_xtensa_on_halt(&xtensa_mcore->cores_targets[xtensa_mcore->active_core]);
519+
struct target *active_sub_target = &xtensa_mcore->cores_targets[xtensa_mcore->active_core];
520+
ret = esp_xtensa_on_halt(active_sub_target);
521+
522+
/* semihosting's version syncing */
523+
for (size_t i = 0; i < xtensa_mcore->configured_cores_num; i++) {
524+
if (i != xtensa_mcore->active_core) { /* for non-active cores */
525+
/* take a core */
526+
struct target *sub_target = &xtensa_mcore->cores_targets[i];
527+
/* sync version with an active core */
528+
target_to_esp_xtensa(sub_target)->semihost.version =
529+
target_to_esp_xtensa(active_sub_target)->semihost.version;
530+
}
531+
}
532+
return ret;
520533
}
521534

522535
static int esp32_virt2phys(struct target *target,
@@ -597,13 +610,19 @@ static int esp32_handle_target_event(struct target *target, enum target_event ev
597610
static int esp32_target_init(struct command_context *cmd_ctx, struct target *target)
598611
{
599612
struct xtensa_mcore_common *xtensa_mcore = target_to_xtensa_mcore(target);
600-
601613
int ret = target_register_event_callback(esp32_handle_target_event, target);
602614
if (ret != ERROR_OK)
603615
return ret;
616+
604617
ret = xtensa_mcore_target_init(cmd_ctx, target);
605618
if (ret != ERROR_OK)
606619
return ret;
620+
621+
for (int i = 0; i < xtensa_mcore->configured_cores_num; i++) {
622+
struct target *sub_target = &xtensa_mcore->cores_targets[i];
623+
if (esp_xtensa_semihosting_init(sub_target))
624+
return ERROR_FAIL;
625+
}
607626
xtensa_mcore->smp_break = OCDDCR_BREAKINEN|OCDDCR_BREAKOUTEN;
608627
return ERROR_OK;
609628
}

src/target/esp32s2.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,11 @@ static int esp32_s2_target_init(struct command_context *cmd_ctx, struct target *
422422
int ret = esp_xtensa_target_init(cmd_ctx, target);
423423
if (ret != ERROR_OK)
424424
return ret;
425+
426+
ret = esp_xtensa_semihosting_init(target);
427+
if (ret != ERROR_OK)
428+
return ERROR_FAIL;
429+
425430
return ERROR_OK;
426431
}
427432

0 commit comments

Comments
 (0)