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

Reply via email to