165
target/main.c
165
target/main.c
@@ -27,41 +27,41 @@
|
||||
|
||||
const char DUMP_START_MAGIC[] = {0x10, 0xAD, 0xDA, 0x7A};
|
||||
|
||||
typedef uint32_t * reg_t;
|
||||
typedef uint32_t *reg_t;
|
||||
|
||||
const volatile reg_t RCC_APB1ENR = (reg_t) 0x4002101Cu;
|
||||
const volatile reg_t RCC_APB2ENR = (reg_t) 0x40021018u;
|
||||
const volatile reg_t GPIOA_CRH = (reg_t) 0x40010804u;
|
||||
const volatile reg_t GPIOA_CRL = (reg_t) 0x40010800u;
|
||||
const volatile reg_t GPIOB_CRH = (reg_t) 0x40010C04u;
|
||||
const volatile reg_t IO_B_MODE_L = (reg_t) 0x40010C00u;
|
||||
const volatile reg_t USART1_CTRL = (reg_t) 0x40013800u;
|
||||
const volatile reg_t USART2_CTRL = (reg_t) 0x40004400u;
|
||||
const volatile reg_t USART3_CTRL = (reg_t) 0x40004800u;
|
||||
const volatile reg_t RCC_APB1ENR = (reg_t)0x4002101Cu;
|
||||
const volatile reg_t RCC_APB2ENR = (reg_t)0x40021018u;
|
||||
const volatile reg_t GPIOA_CRH = (reg_t)0x40010804u;
|
||||
const volatile reg_t GPIOA_CRL = (reg_t)0x40010800u;
|
||||
const volatile reg_t GPIOB_CRH = (reg_t)0x40010C04u;
|
||||
const volatile reg_t IO_B_MODE_L = (reg_t)0x40010C00u;
|
||||
const volatile reg_t USART1_CTRL = (reg_t)0x40013800u;
|
||||
const volatile reg_t USART2_CTRL = (reg_t)0x40004400u;
|
||||
const volatile reg_t USART3_CTRL = (reg_t)0x40004800u;
|
||||
|
||||
volatile reg_t sel_usart_ctrl;
|
||||
|
||||
void readChar( uint8_t const chr );
|
||||
void writeByte( uint8_t b );
|
||||
void writeStr( uint8_t const * const str );
|
||||
void writeChar( uint8_t const chr );
|
||||
void writeWordLe( uint32_t const word );
|
||||
void writeWordBe( uint32_t const word );
|
||||
void readCmd( uint8_t const * const cmd);
|
||||
uint32_t hexToInt(uint8_t const * const hex);
|
||||
void readChar(uint8_t const chr);
|
||||
void writeByte(uint8_t b);
|
||||
void writeStr(uint8_t const *const str);
|
||||
void writeChar(uint8_t const chr);
|
||||
void writeWordLe(uint32_t const word);
|
||||
void writeWordBe(uint32_t const word);
|
||||
void readCmd(uint8_t const *const cmd);
|
||||
uint32_t hexToInt(uint8_t const *const hex);
|
||||
void readMem(uint32_t const addr, uint32_t const len);
|
||||
void writeMem(uint32_t const addr, uint32_t const data);
|
||||
|
||||
uint8_t const strHelp[] = "Help\r\n-----------\r\n"
|
||||
"ADDR, VAL, LEN: 32-bit Hex encoded:\r\n e.g., 0A1337FF\r\n"
|
||||
"-----------\r\n"
|
||||
"R ADDR LEN - Read 32-bit word\r\n"
|
||||
"W ADDR VAL - Write 32-bit word\r\n"
|
||||
"D - Dump all flash memory\r\n"
|
||||
"S - Reboot\r\n"
|
||||
"E - Exit\r\n"
|
||||
"H - Show help \r\n"
|
||||
"---------------\r\n";
|
||||
uint8_t const strHelp[] = "Help\r\n-----------\r\n"
|
||||
"ADDR, VAL, LEN: 32-bit Hex encoded:\r\n e.g., 0A1337FF\r\n"
|
||||
"-----------\r\n"
|
||||
"R ADDR LEN - Read 32-bit word\r\n"
|
||||
"W ADDR VAL - Write 32-bit word\r\n"
|
||||
"D - Dump all flash memory\r\n"
|
||||
"S - Reboot\r\n"
|
||||
"E - Exit\r\n"
|
||||
"H - Show help \r\n"
|
||||
"---------------\r\n";
|
||||
|
||||
#define PIN_CONFIG_ALT_PUSH_PULL 0xB
|
||||
#define PIN_CONFIG_INPUT_PULL_UP 0x8
|
||||
@@ -71,7 +71,7 @@ uint8_t const strHelp[] = "Help\r\n-----------\r\n"
|
||||
reg_t init_usart1()
|
||||
{
|
||||
/* Enable Clocks */
|
||||
*RCC_APB2ENR |= (1 << 2); // Input-Output Port A clock enable
|
||||
*RCC_APB2ENR |= (1 << 2); // Input-Output Port A clock enable
|
||||
*RCC_APB2ENR |= (1 << 14); // USART1 clock enable
|
||||
|
||||
/* Configure Pins */
|
||||
@@ -96,7 +96,7 @@ reg_t init_usart1()
|
||||
reg_t init_usart2()
|
||||
{
|
||||
/* USART2 clock enable */
|
||||
*RCC_APB2ENR |= (1 << 2); // Input-Output Port A clock enable
|
||||
*RCC_APB2ENR |= (1 << 2); // Input-Output Port A clock enable
|
||||
*RCC_APB1ENR |= (1 << 17); // USART2 clock enable
|
||||
|
||||
/* Configure Pins */
|
||||
@@ -157,42 +157,52 @@ int main(void)
|
||||
// Flash size register, RM0008, page 1076:
|
||||
// https://www.st.com/resource/en/reference_manual/rm0008-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf
|
||||
|
||||
uint32_t flash_size = *(uint32_t*) 0x1FFFF7E0 & 0xFFFF;
|
||||
if(flash_size == 64) // Force reading of the entire 128KB flash in 64KB devices, often used.
|
||||
uint32_t flash_size = *(uint32_t *)0x1FFFF7E0 & 0xFFFF;
|
||||
if (flash_size == 64) // Force reading of the entire 128KB flash in 64KB devices, often used.
|
||||
flash_size = 128;
|
||||
|
||||
/* Print start magic to inform the attack board that
|
||||
we are going to dump */
|
||||
for (uint32_t i = 0; i < sizeof(DUMP_START_MAGIC); i++) {
|
||||
for (uint32_t i = 0; i < sizeof(DUMP_START_MAGIC); i++)
|
||||
{
|
||||
writeChar(DUMP_START_MAGIC[i]);
|
||||
}
|
||||
|
||||
uint32_t const * addr = (uint32_t*) 0x08000000;
|
||||
while (((uintptr_t) addr) < (0x08000000U + (flash_size * 1024U) )) {
|
||||
uint32_t const *addr = (uint32_t *)0x08000000;
|
||||
while (((uintptr_t)addr) < (0x08000000U + (flash_size * 1024U)))
|
||||
{
|
||||
writeWordBe(*addr);
|
||||
++addr;
|
||||
}
|
||||
}
|
||||
|
||||
/* hex must have length 8 */
|
||||
uint32_t hexToInt(uint8_t const * const hex)
|
||||
uint32_t hexToInt(uint8_t const *const hex)
|
||||
{
|
||||
uint32_t ind = 0u;
|
||||
uint32_t res = 0u;
|
||||
|
||||
for (ind = 0; ind < 8; ++ind) {
|
||||
for (ind = 0; ind < 8; ++ind)
|
||||
{
|
||||
uint8_t chr = hex[ind];
|
||||
uint32_t val = 0u;
|
||||
|
||||
res <<= 4u;
|
||||
|
||||
if ((chr >= '0') && (chr <= '9')) {
|
||||
if ((chr >= '0') && (chr <= '9'))
|
||||
{
|
||||
val = chr - '0';
|
||||
} else if ((chr >= 'a') && (chr <= 'f')) {
|
||||
}
|
||||
else if ((chr >= 'a') && (chr <= 'f'))
|
||||
{
|
||||
val = chr - 'a' + 0x0a;
|
||||
} else if ((chr >= 'A') && (chr <= 'F')) {
|
||||
}
|
||||
else if ((chr >= 'A') && (chr <= 'F'))
|
||||
{
|
||||
val = chr - 'A' + 0x0a;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
val = 0u;
|
||||
}
|
||||
res |= val;
|
||||
@@ -201,17 +211,19 @@ uint32_t hexToInt(uint8_t const * const hex)
|
||||
return res;
|
||||
}
|
||||
|
||||
void readChar( uint8_t const chr )
|
||||
void readChar(uint8_t const chr)
|
||||
{
|
||||
#define CMDBUF_LEN (64u)
|
||||
static uint8_t cmdbuf[CMDBUF_LEN] = {0u};
|
||||
static uint32_t cmdInd = 0u;
|
||||
|
||||
switch (chr) {
|
||||
switch (chr)
|
||||
{
|
||||
case '\n':
|
||||
case '\r':
|
||||
cmdbuf[cmdInd] = 0u;
|
||||
if (cmdInd != 0) {
|
||||
if (cmdInd != 0)
|
||||
{
|
||||
writeStr("\r\n");
|
||||
}
|
||||
readCmd(cmdbuf);
|
||||
@@ -219,8 +231,9 @@ void readChar( uint8_t const chr )
|
||||
writeStr("\r\n> ");
|
||||
{
|
||||
uint32_t ind = 0u;
|
||||
for (ind = 0; ind<CMDBUF_LEN; ++ind) {
|
||||
cmdbuf[ind]=0x00u;
|
||||
for (ind = 0; ind < CMDBUF_LEN; ++ind)
|
||||
{
|
||||
cmdbuf[ind] = 0x00u;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -234,7 +247,8 @@ void readChar( uint8_t const chr )
|
||||
break;
|
||||
|
||||
default:
|
||||
if (cmdInd < (CMDBUF_LEN - 1)) {
|
||||
if (cmdInd < (CMDBUF_LEN - 1))
|
||||
{
|
||||
cmdbuf[cmdInd] = chr;
|
||||
++cmdInd;
|
||||
writeChar(chr);
|
||||
@@ -243,9 +257,10 @@ void readChar( uint8_t const chr )
|
||||
}
|
||||
}
|
||||
|
||||
void readCmd( uint8_t const * const cmd )
|
||||
void readCmd(uint8_t const *const cmd)
|
||||
{
|
||||
switch (cmd[0]) {
|
||||
switch (cmd[0])
|
||||
{
|
||||
case 0:
|
||||
return;
|
||||
break;
|
||||
@@ -269,12 +284,14 @@ void readCmd( uint8_t const * const cmd )
|
||||
case 'D':
|
||||
writeStr("\r\n\r\n");
|
||||
{
|
||||
uint32_t const * addr = (uint32_t*) 0x08000000;
|
||||
uint32_t const *addr = (uint32_t *)0x08000000;
|
||||
uint32_t br = 8u;
|
||||
while (((uintptr_t) addr) < (0x08000000 + 64u * 1024u)) {
|
||||
if (br == 8u) {
|
||||
while (((uintptr_t)addr) < (0x08000000 + 64u * 1024u))
|
||||
{
|
||||
if (br == 8u)
|
||||
{
|
||||
writeStr("\r\n[");
|
||||
writeWordBe((uint32_t) addr);
|
||||
writeWordBe((uint32_t)addr);
|
||||
writeStr("]: ");
|
||||
br = 0u;
|
||||
}
|
||||
@@ -298,19 +315,19 @@ void readCmd( uint8_t const * const cmd )
|
||||
case 's':
|
||||
case 'S':
|
||||
writeStr("Rebooting...\r\n\r\n");
|
||||
*((uint32_t *) 0xE000ED0C) = 0x05FA0004u;
|
||||
*((uint32_t *)0xE000ED0C) = 0x05FA0004u;
|
||||
break;
|
||||
|
||||
/* exit */
|
||||
case 'e':
|
||||
case 'E':
|
||||
writeStr("Bye.\r\n");
|
||||
while (1) {
|
||||
while (1)
|
||||
{
|
||||
__asm__ volatile("wfi");
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
writeStr("Unknown command: ");
|
||||
writeStr(cmd);
|
||||
@@ -321,33 +338,34 @@ void readCmd( uint8_t const * const cmd )
|
||||
|
||||
const uint8_t txtMap[] = "0123456789ABCDEF";
|
||||
|
||||
void writeByte( uint8_t b )
|
||||
void writeByte(uint8_t b)
|
||||
{
|
||||
writeChar(txtMap[b >> 4]);
|
||||
writeChar(txtMap[b & 0x0F]);
|
||||
}
|
||||
|
||||
|
||||
void writeStr( uint8_t const * const str )
|
||||
void writeStr(uint8_t const *const str)
|
||||
{
|
||||
uint32_t ind = 0u;
|
||||
|
||||
while (str[ind]) {
|
||||
while (str[ind])
|
||||
{
|
||||
writeChar(str[ind]);
|
||||
++ind;
|
||||
}
|
||||
}
|
||||
|
||||
void writeChar( uint8_t const chr )
|
||||
void writeChar(uint8_t const chr)
|
||||
{
|
||||
while (!(sel_usart_ctrl[0] & 0x80u)) {
|
||||
while (!(sel_usart_ctrl[0] & 0x80u))
|
||||
{
|
||||
/* wait */
|
||||
}
|
||||
|
||||
sel_usart_ctrl[1] = chr;
|
||||
}
|
||||
|
||||
void writeWordLe( uint32_t const word )
|
||||
void writeWordLe(uint32_t const word)
|
||||
{
|
||||
writeByte((word & 0x000000FF));
|
||||
writeByte((word & 0x0000FF00) >> 8);
|
||||
@@ -355,7 +373,7 @@ void writeWordLe( uint32_t const word )
|
||||
writeByte((word & 0xFF000000) >> 24);
|
||||
}
|
||||
|
||||
void writeWordBe( uint32_t const word )
|
||||
void writeWordBe(uint32_t const word)
|
||||
{
|
||||
writeChar((word & 0x000000FF));
|
||||
writeChar((word & 0x0000FF00) >> 8);
|
||||
@@ -363,13 +381,14 @@ void writeWordBe( uint32_t const word )
|
||||
writeChar((word & 0xFF000000) >> 24);
|
||||
}
|
||||
|
||||
void alertCrash( uint32_t crashId )
|
||||
void alertCrash(uint32_t crashId)
|
||||
{
|
||||
writeStr("!!! EXCEPTION !!!\r\nID: ");
|
||||
writeByte(crashId);
|
||||
writeStr("\r\nRestart required!\r\n\r\n");
|
||||
*((uint32_t *) 0xE000ED0C) = 0x05FA0004u;
|
||||
while (1);
|
||||
*((uint32_t *)0xE000ED0C) = 0x05FA0004u;
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
|
||||
void readMem(uint32_t const addr, uint32_t const len)
|
||||
@@ -379,16 +398,18 @@ void readMem(uint32_t const addr, uint32_t const len)
|
||||
uint32_t lenx = 0u;
|
||||
|
||||
lenx = len;
|
||||
if (lenx == 0u) {
|
||||
if (lenx == 0u)
|
||||
{
|
||||
lenx = 4u;
|
||||
}
|
||||
|
||||
for (it = 0u; it < (lenx / 4u); ++it) {
|
||||
addrx = addr + it*4u;
|
||||
for (it = 0u; it < (lenx / 4u); ++it)
|
||||
{
|
||||
addrx = addr + it * 4u;
|
||||
writeStr("Read [");
|
||||
writeWordBe(addrx);
|
||||
writeStr("]: ");
|
||||
writeWordBe(*((uint32_t*)addrx));
|
||||
writeWordBe(*((uint32_t *)addrx));
|
||||
writeStr("\r\n");
|
||||
}
|
||||
}
|
||||
@@ -399,6 +420,6 @@ void writeMem(uint32_t const addr, uint32_t const data)
|
||||
writeWordBe(addr);
|
||||
writeStr("]: ");
|
||||
writeWordBe(data);
|
||||
*((uint32_t*) addr) = data;
|
||||
*((uint32_t *)addr) = data;
|
||||
writeStr("\r\n");
|
||||
}
|
||||
Reference in New Issue
Block a user