mirror of
https://github.com/andreili/katapult.git
synced 2025-08-24 03:44:06 +02:00
stm32: Improve out-of-bounds check on erase sector index calculation
Avoid wrapping the sector index, as that could potentially result in erasing the booloader itself. Also, move the stm32f4_sector_index() inline into erase_page(). Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
1e6a2de3b1
commit
4857a70189
@ -10,23 +10,6 @@
|
|||||||
#include "flash.h" // flash_write_block
|
#include "flash.h" // flash_write_block
|
||||||
#include "internal.h" // FLASH
|
#include "internal.h" // FLASH
|
||||||
|
|
||||||
#if CONFIG_MACH_STM32F2 || CONFIG_MACH_STM32F4
|
|
||||||
#define FLASH_KEY1 (0x45670123UL)
|
|
||||||
#define FLASH_KEY2 (0xCDEF89ABUL)
|
|
||||||
|
|
||||||
// Return the flash sector index for the page at the given address
|
|
||||||
static uint32_t
|
|
||||||
stm32f4_sector_index(uint32_t addr)
|
|
||||||
{
|
|
||||||
if (addr < 0x08010000)
|
|
||||||
return (addr - 0x08000000) / (16 * 1024);
|
|
||||||
else if (addr < 0x08020000)
|
|
||||||
return 4;
|
|
||||||
else
|
|
||||||
return 5 + (addr - 0x08020000) / (128 * 1024);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Return the flash page size at the given address
|
// Return the flash page size at the given address
|
||||||
static uint32_t
|
static uint32_t
|
||||||
flash_get_page_size(uint32_t addr)
|
flash_get_page_size(uint32_t addr)
|
||||||
@ -71,6 +54,11 @@ wait_flash(void)
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef FLASH_KEY1 // Some stm32 headers don't define this
|
||||||
|
#define FLASH_KEY1 (0x45670123UL)
|
||||||
|
#define FLASH_KEY2 (0xCDEF89ABUL)
|
||||||
|
#endif
|
||||||
|
|
||||||
// Issue low-level flash hardware unlock sequence
|
// Issue low-level flash hardware unlock sequence
|
||||||
static void
|
static void
|
||||||
unlock_flash(void)
|
unlock_flash(void)
|
||||||
@ -95,8 +83,16 @@ static void
|
|||||||
erase_page(uint32_t page_address)
|
erase_page(uint32_t page_address)
|
||||||
{
|
{
|
||||||
#if CONFIG_MACH_STM32F2 || CONFIG_MACH_STM32F4
|
#if CONFIG_MACH_STM32F2 || CONFIG_MACH_STM32F4
|
||||||
|
uint32_t sidx;
|
||||||
|
if (page_address < 0x08010000)
|
||||||
|
sidx = (page_address - 0x08000000) / (16 * 1024);
|
||||||
|
else if (page_address < 0x08020000)
|
||||||
|
sidx = 4;
|
||||||
|
else
|
||||||
|
sidx = 5 + (page_address - 0x08020000) / (128 * 1024);
|
||||||
|
sidx = sidx > 0x0f ? 0x0f : sidx;
|
||||||
FLASH->CR = (FLASH_CR_PSIZE_1 | FLASH_CR_STRT | FLASH_CR_SER
|
FLASH->CR = (FLASH_CR_PSIZE_1 | FLASH_CR_STRT | FLASH_CR_SER
|
||||||
| ((stm32f4_sector_index(page_address) & 0xF) << 3));
|
| (sidx << FLASH_CR_SNB_Pos));
|
||||||
#else
|
#else
|
||||||
FLASH->CR = FLASH_CR_PER;
|
FLASH->CR = FLASH_CR_PER;
|
||||||
FLASH->AR = page_address;
|
FLASH->AR = page_address;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user