Skip to content

Commit 9caa5bf

Browse files
author
Memfault Inc
committed
Memfault Firmware SDK 0.38.0 (Build 1368)
1 parent dbe84b9 commit 9caa5bf

File tree

6 files changed

+61
-25
lines changed

6 files changed

+61
-25
lines changed

CHANGES.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
### Changes between Memfault SDK 0.38.0 and SDK 0.37.2 - Feb 1, 2023
2+
3+
#### :rocket: New Features
4+
5+
- Enable coredumps on the ESP32-S2 and ESP32-S3 chips.
6+
17
### Changes between Memfault SDK 0.37.2 and SDK 0.37.1 - Jan 31, 2023
28

39
#### :chart_with_upwards_trend: Improvements

VERSION

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
BUILD ID: 1352
2-
GIT COMMIT: a083eca61
1+
BUILD ID: 1368
2+
GIT COMMIT: 4a9233626

components/include/memfault/version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ typedef struct {
1919
uint8_t patch;
2020
} sMfltSdkVersion;
2121

22-
#define MEMFAULT_SDK_VERSION { .major = 0, .minor = 37, .patch = 2 }
22+
#define MEMFAULT_SDK_VERSION { .major = 0, .minor = 38, .patch = 0 }
2323

2424
#ifdef __cplusplus
2525
}

components/panics/src/memfault_coredump.c

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,29 @@ typedef MEMFAULT_PACKED_STRUCT MfltTraceReasonBlock {
6767

6868
#define MEMFAULT_MACHINE_TYPE_SUBTYPE_OFFSET 16
6969

70+
//! ESP32
7071
#define MEMFAULT_MACHINE_TYPE_XTENSA 94
7172

73+
//! ESP8266
7274
#define MEMFAULT_MACHINE_TYPE_XTENSA_LX106 \
7375
((1 << MEMFAULT_MACHINE_TYPE_SUBTYPE_OFFSET) | MEMFAULT_MACHINE_TYPE_XTENSA)
7476

75-
typedef enum MfltCoredumpMachineType {
77+
//! ESP32-S2
78+
#define MEMFAULT_MACHINE_TYPE_XTENSA_LX7 \
79+
((2 << MEMFAULT_MACHINE_TYPE_SUBTYPE_OFFSET) | MEMFAULT_MACHINE_TYPE_XTENSA)
80+
81+
//! ESP32-S3
82+
#define MEMFAULT_MACHINE_TYPE_XTENSA_LX7_DUAL \
83+
((3 << MEMFAULT_MACHINE_TYPE_SUBTYPE_OFFSET) | MEMFAULT_MACHINE_TYPE_XTENSA)
84+
85+
typedef enum MfltCoredumpMachineType {
7686
kMfltCoredumpMachineType_None = 0,
7787
kMfltCoredumpMachineType_ARM = 40,
7888
kMfltCoredumpMachineType_Aarch64 = 183,
7989
kMfltCoredumpMachineType_Xtensa = MEMFAULT_MACHINE_TYPE_XTENSA,
80-
kMfltCoredumpMachineType_XtensaLx106 = MEMFAULT_MACHINE_TYPE_XTENSA_LX106
90+
kMfltCoredumpMachineType_XtensaLx106 = MEMFAULT_MACHINE_TYPE_XTENSA_LX106,
91+
kMfltCoredumpMachineType_XtensaLx7 = MEMFAULT_MACHINE_TYPE_XTENSA_LX7,
92+
kMfltCoredumpMachineType_XtensaLx7Dual = MEMFAULT_MACHINE_TYPE_XTENSA_LX7_DUAL,
8193
} eMfltCoredumpMachineType;
8294

8395
typedef MEMFAULT_PACKED_STRUCT MfltMachineTypeBlock {
@@ -220,23 +232,30 @@ static eMfltCoredumpBlockType prv_region_type_to_storage_type(eMfltCoredumpRegio
220232
}
221233

222234
static eMfltCoredumpMachineType prv_get_machine_type(void) {
235+
return
223236
#if defined(MEMFAULT_UNITTEST)
224-
return kMfltCoredumpMachineType_None;
237+
kMfltCoredumpMachineType_None
238+
#elif MEMFAULT_COMPILER_ARM
239+
kMfltCoredumpMachineType_ARM
240+
#elif defined(__aarch64__)
241+
kMfltCoredumpMachineType_Aarch64
242+
#elif defined(__XTENSA__) && defined(__XTENSA_WINDOWED_ABI__) && defined(__XTENSA_SOFT_FLOAT__)
243+
// ESP32-S2 has this unique compiler-defined symbol
244+
kMfltCoredumpMachineType_XtensaLx7
245+
#elif defined(__XTENSA__) && defined(__XTENSA_WINDOWED_ABI__) && defined(CONFIG_IDF_TARGET_ESP32S3)
246+
// rely on Kconfig provided flag for ESP32-S3; compiler defined symbols are identical to ESP32.
247+
// ❯ diff -duw <(xtensa-esp32-elf-gcc -dM -E - < /dev/null) <(xtensa-esp32s3-elf-gcc -dM -E - < /dev/null)
248+
kMfltCoredumpMachineType_XtensaLx7Dual
249+
#elif defined(__XTENSA__) && defined(__XTENSA_WINDOWED_ABI__)
250+
// default xtensa windowed target is vanilla ESP32
251+
kMfltCoredumpMachineType_Xtensa
252+
#elif defined(__XTENSA__)
253+
// finally, ESP8266
254+
kMfltCoredumpMachineType_XtensaLx106
225255
#else
226-
# if MEMFAULT_COMPILER_ARM
227-
return kMfltCoredumpMachineType_ARM;
228-
# elif defined(__aarch64__)
229-
return kMfltCoredumpMachineType_Aarch64;
230-
# elif defined(__XTENSA__)
231-
# if defined(__XTENSA_WINDOWED_ABI__)
232-
return kMfltCoredumpMachineType_Xtensa;
233-
# else
234-
return kMfltCoredumpMachineType_XtensaLx106;
235-
# endif
236-
# else
237-
# error "Coredumps are not supported for target architecture"
238-
# endif
256+
#error "Coredumps are not supported for target architecture"
239257
#endif
258+
;
240259
}
241260

242261
static bool prv_write_device_info_blocks(sMfltCoredumpWriteCtx *ctx) {

ports/esp_idf/memfault/common/memfault_fault_handler.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,12 @@ void __wrap_esp_core_dump_to_flash(XtExcFrame *fp) {
7474
fp->a15,
7575
},
7676
.sar = fp->sar,
77-
#if CONFIG_IDF_TARGET_ESP32
77+
// the below registers are not available on the esp32s2; leave them zeroed
78+
// in the coredump
79+
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S3
7880
.lbeg = fp->lbeg,
7981
.lend = fp->lend,
8082
.lcount = fp->lcount,
81-
#elif CONFIG_IDF_TARGET_ESP32S2
82-
// TODO implement fault capture for the ESP32-S2
83-
#elif CONFIG_IDF_TARGET_ESP32S3
84-
// TODO implement fault capture for the ESP32-S3
8583
#endif
8684
.exccause = fp->exccause,
8785
.excvaddr = fp->excvaddr,

ports/esp_idf/memfault/common/memfault_platform_coredump.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,22 @@ const sMfltCoredumpRegion *memfault_platform_coredump_get_regions(
8585
const sCoredumpCrashInfo *crash_info, size_t *num_regions) {
8686
static sMfltCoredumpRegion s_coredump_regions[1];
8787

88+
// The ESP32S2 + S3 have a different memory map than the ESP32; IRAM and DRAM
89+
// share the same pysical SRAM, but are mapped at different addresses. We need
90+
// to account for the placement of IRAM data, which offsets the start of
91+
// placed DRAM.
92+
//
93+
// https://www.espressif.com/sites/default/files/documentation/esp32-s2_technical_reference_manual_en.pdf#subsubsection.3.3.2
94+
// https://www.espressif.com/sites/default/files/documentation/esp32-s3_technical_reference_manual_en.pdf#subsubsection.4.3.2
95+
#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32S2)
96+
// use this symbol defined by the linker to find the start of DRAM
97+
extern uint32_t _data_start;
98+
const uint32_t esp32_dram_start_addr = (uint32_t)&_data_start;
99+
#else
88100
const uint32_t esp32_dram_start_addr = SOC_DMA_LOW;
101+
#endif
89102

90-
size_t dram_collection_len = SOC_DMA_HIGH - SOC_DMA_LOW;
103+
size_t dram_collection_len = SOC_DMA_HIGH - esp32_dram_start_addr;
91104
const esp_partition_t *core_part = prv_get_core_partition();
92105
if (core_part != NULL) {
93106
// NB: Leave some space in storage for other regions collected by the SDK

0 commit comments

Comments
 (0)