This is an automated email from Gerrit. Tomas Vanek (van...@fbl.cz) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/5107
-- gerrit commit 62b9c3537d3cd48426b86827358b92a69110853a Author: Tomas Vanek <van...@fbl.cz> Date: Thu Apr 11 08:39:10 2019 +0200 flash: read only alias Similar as virtual flash but has write/erase suppressed. 'virtual' flash driver name check in flash_free_all_banks() was replaced by a customized free_driver_priv() Change-Id: I528760aad0ba55ebc57fc1fabfdfdf07c92cac94 Signed-off-by: Tomas Vanek <van...@fbl.cz> diff --git a/doc/openocd.texi b/doc/openocd.texi index cec1fb4..912cc9e 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -5129,7 +5129,7 @@ Some drivers also activate driver-specific commands. This is a special driver that maps a previously defined bank to another address. All bank settings will be copied from the master physical bank. -The @var{virtual} driver defines one mandatory parameters, +The @var{virtual} driver defines one mandatory parameter, @itemize @item @var{master_bank} The bank that this virtual address refers to. @@ -5147,6 +5147,18 @@ flash bank vbank1 virtual 0x9fc00000 0 0 0 \ @end example @end deffn +@deffn {Flash Driver} ro_alias +Similar as @var{virtual} driver but suppresses write +and erase. Use to build a complete memory map for gdb. +Bank size will be copied from the master physical bank. + +The @var{virtual} driver defines one mandatory parameter, + +@itemize +@item @var{master_bank} The bank that this virtual address refers to. +@end itemize +@end deffn + @deffn {Flash Driver} read_only A stub driver without write and erase. Use to define a ROM region for the gdb memory map. diff --git a/src/flash/nor/core.c b/src/flash/nor/core.c index 2d750f0..735f523 100644 --- a/src/flash/nor/core.c +++ b/src/flash/nor/core.c @@ -195,15 +195,8 @@ void flash_free_all_banks(void) else LOG_WARNING("Flash driver of %s does not support free_driver_priv()", bank->name); - /* For 'virtual' flash driver bank->sectors and bank->prot_blocks pointers are copied from - * master flash_bank structure. They point to memory locations allocated by master flash driver - * so master driver is responsible for releasing them. - * Avoid UB caused by double-free memory corruption if flash bank is 'virtual'. */ - - if (strcmp(bank->driver->name, "virtual") != 0) { - free(bank->sectors); - free(bank->prot_blocks); - } + free(bank->sectors); + free(bank->prot_blocks); free(bank->name); free(bank); diff --git a/src/flash/nor/drivers.c b/src/flash/nor/drivers.c index ad322a0..ed3271a 100644 --- a/src/flash/nor/drivers.c +++ b/src/flash/nor/drivers.c @@ -67,6 +67,7 @@ extern const struct flash_driver psoc5lp_eeprom_flash; extern const struct flash_driver psoc5lp_nvl_flash; extern const struct flash_driver psoc6_flash; extern const struct flash_driver read_only_flash; +extern const struct flash_driver ro_alias_flash; extern const struct flash_driver sim3x_flash; extern const struct flash_driver stellaris_flash; extern const struct flash_driver stm32f1x_flash; @@ -137,6 +138,7 @@ static const struct flash_driver * const flash_drivers[] = { &psoc5lp_nvl_flash, &psoc6_flash, &read_only_flash, + &ro_alias_flash, &sim3x_flash, &stellaris_flash, &stm32f1x_flash, diff --git a/src/flash/nor/virtual.c b/src/flash/nor/virtual.c index fa51537..94851ab 100644 --- a/src/flash/nor/virtual.c +++ b/src/flash/nor/virtual.c @@ -2,6 +2,9 @@ * Copyright (C) 2010 by Spencer Oliver * * s...@spen-soft.co.uk * * * + * Copyright (C) 2019 by Tomas Vanek * + * van...@fbl.cz * + * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * @@ -42,6 +45,9 @@ static void virtual_update_bank_info(struct flash_bank *bank) /* update the info we do not have */ bank->size = master_bank->size; + if (bank->read_only) + return; + bank->chip_width = master_bank->chip_width; bank->bus_width = master_bank->bus_width; bank->erased_value = master_bank->erased_value; @@ -224,6 +230,19 @@ static int virtual_flash_read(struct flash_bank *bank, return ERROR_OK; } +void virtual_flash_free_driver_priv(struct flash_bank *bank) +{ + free(bank->driver_priv); + bank->driver_priv = NULL; + + /* For 'virtual' flash driver bank->sectors and bank->prot_blocks pointers are copied from + * master flash_bank structure. They point to memory locations allocated by master flash driver + * so master driver is responsible for releasing them. + * Avoid UB caused by double-free memory corruption if flash bank is 'virtual'. */ + bank->sectors = NULL; + bank->prot_blocks = NULL; +} + const struct flash_driver virtual_flash = { .name = "virtual", .flash_bank_command = virtual_flash_bank_command, @@ -236,5 +255,54 @@ const struct flash_driver virtual_flash = { .erase_check = virtual_blank_check, .protect_check = virtual_protect_check, .info = virtual_info, - .free_driver_priv = default_flash_free_driver_priv, + .free_driver_priv = virtual_flash_free_driver_priv, +}; + + +FLASH_BANK_COMMAND_HANDLER(ro_alias_bank_command) +{ + if (CMD_ARGC < 7) + return ERROR_COMMAND_SYNTAX_ERROR; + + /* get the master flash bank */ + const char *bank_name = CMD_ARGV[6]; + struct flash_bank *master_bank = get_flash_bank_by_name_noprobe(bank_name); + + if (master_bank == NULL) { + LOG_ERROR("master flash bank '%s' does not exist", bank_name); + return ERROR_FLASH_OPERATION_FAILED; + } + + /* save master bank name - use this to get settings later */ + bank->driver_priv = strdup(bank_name); + + bank->read_only = true; + + return ERROR_OK; +} + +static int ro_alias_erase(struct flash_bank *bank, int first, int last) +{ + LOG_ERROR("Erase of read-only flash alias refused. Use master flash bank '%s'", (char *)bank->driver_priv); + return ERROR_FAIL; +} + +static int ro_alias_write(struct flash_bank *bank, const uint8_t *buffer, + uint32_t offset, uint32_t count) +{ + LOG_ERROR("Write to read-only flash alias refused. Use master flash bank '%s'", (char *)bank->driver_priv); + return ERROR_FAIL; +} + +const struct flash_driver ro_alias_flash = { + .name = "ro_alias", + .flash_bank_command = ro_alias_bank_command, + .erase = ro_alias_erase, + .write = ro_alias_write, + .read = virtual_flash_read, + .probe = virtual_probe, + .auto_probe = virtual_auto_probe, + .erase_check = virtual_blank_check, + .info = virtual_info, + .free_driver_priv = virtual_flash_free_driver_priv, }; -- _______________________________________________ OpenOCD-devel mailing list OpenOCD-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openocd-devel