ESP8266 ROM XTOS
来自Jack's Lab
(版本间的差异)
(→SYSTEM_RTC_MEM_READ) |
(→SYSTEM_RTC_MEM_WRITE) |
||
第65行: | 第65行: | ||
return 1; | return 1; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | === SYSTEM_GET_RST_INFO === | ||
+ | |||
+ | <source lang=cpp> | ||
+ | struct rst_info { | ||
+ | uint32 reason; | ||
+ | uint32 exccause; | ||
+ | uint32 epc1; | ||
+ | uint32 epc2; | ||
+ | uint32 epc3; | ||
+ | uint32 excvaddr; | ||
+ | uint32 depc; | ||
+ | }; | ||
+ | |||
+ | struct rst_info system_get_rst_info() | ||
+ | { | ||
+ | struct rst_info rst; | ||
+ | system_rtc_mem_read(0, &rst, sizeof(struct rst_info); | ||
+ | if (rst.reason >= 7) { | ||
+ | ets_memset(&rst, 0, sizeof(struct rst_info)); | ||
+ | } | ||
+ | if (rtc_get_reset_reason() == 2) { | ||
+ | ets_memset(&rst, 0, sizeof(struct rst_info)); | ||
+ | rst.reason = 6; | ||
+ | } | ||
+ | return rst; | ||
} | } | ||
</source> | </source> | ||
<br><br> | <br><br> |
2015年12月11日 (五) 00:18的版本
目录 |
1 逆向工程
2 探索
2.1 SYSTEM_RTC_MEM_READ
uint32 system_rtc_mem_read(int32 addr, void *buff, int32 length) { int32 blocks; // validate reading a user block //if (addr < 64) return 0; if (buff == 0) return 0; // validate 4 byte aligned if (((uint32)buff & 0x3) != 0) return 0; // validate length is multiple of 4 if ((length & 0x3) != 0) return 0; // check valid length from specified starting point if (length > (0x300 - (addr * 4))) return 0; // copy the data for (blocks = (length >> 2) - 1; blocks >= 0; blocks--) { volatile uint32 *ram = ((uint32*)buff) + blocks; volatile uint32 *rtc = ((uint32*)0x60001100) + addr + blocks; *ram = *rtc; } return 1; }
2.2 SYSTEM_RTC_MEM_WRITE
uint32 system_rtc_mem_write(int32 addr, void *buff, int32 length) { int32 blocks; // validate reading a user block if (addr < 64) return 0; if (buff == 0) return 0; // validate 4 byte aligned if (((uint32)buff & 0x3) != 0) return 0; // validate length is multiple of 4 if ((length & 0x3) != 0) return 0; // check valid length from specified starting point if (length > (0x300 - (addr * 4))) return 0; // copy the data for (blocks = (length >> 2) - 1; blocks >= 0; blocks--) { volatile uint32 *ram = ((uint32*)buff) + blocks; volatile uint32 *rtc = ((uint32*)0x60001100) + addr + blocks; *rtc = *ram; } return 1; }
2.3 SYSTEM_GET_RST_INFO
struct rst_info { uint32 reason; uint32 exccause; uint32 epc1; uint32 epc2; uint32 epc3; uint32 excvaddr; uint32 depc; }; struct rst_info system_get_rst_info() { struct rst_info rst; system_rtc_mem_read(0, &rst, sizeof(struct rst_info); if (rst.reason >= 7) { ets_memset(&rst, 0, sizeof(struct rst_info)); } if (rtc_get_reset_reason() == 2) { ets_memset(&rst, 0, sizeof(struct rst_info)); rst.reason = 6; } return rst; }