OpenOCD
virtual.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /*
4  * Copyright (C) 2010 by Spencer Oliver <spen@spen-soft.co.uk>
5  *
6  * Copyright (C) 2019 by Tomas Vanek <vanekt@fbl.cz>
7  */
8 
9 #ifdef HAVE_CONFIG_H
10 #include "config.h"
11 #endif
12 
13 #include "imp.h"
14 
16 {
17  struct flash_bank *master_bank;
18 
19  master_bank = get_flash_bank_by_name_noprobe(bank->driver_priv);
20  if (!master_bank)
21  LOG_ERROR("master flash bank '%s' does not exist", (char *)bank->driver_priv);
22 
23  return master_bank;
24 }
25 
27 {
28  struct flash_bank *master_bank = virtual_get_master_bank(bank);
29 
30  if (!master_bank)
31  return;
32 
33  /* update the info we do not have */
34  bank->size = master_bank->size;
35  if (bank->read_only)
36  return;
37 
38  bank->chip_width = master_bank->chip_width;
39  bank->bus_width = master_bank->bus_width;
40  bank->erased_value = master_bank->erased_value;
41  bank->default_padded_value = master_bank->default_padded_value;
42  bank->write_start_alignment = master_bank->write_start_alignment;
43  bank->write_end_alignment = master_bank->write_end_alignment;
44  bank->minimal_write_gap = master_bank->minimal_write_gap;
45  bank->num_sectors = master_bank->num_sectors;
46  bank->sectors = master_bank->sectors;
47  bank->num_prot_blocks = master_bank->num_prot_blocks;
48  bank->prot_blocks = master_bank->prot_blocks;
49 }
50 
51 FLASH_BANK_COMMAND_HANDLER(virtual_flash_bank_command)
52 {
53  if (CMD_ARGC < 7)
55 
56  /* get the master flash bank */
57  const char *bank_name = CMD_ARGV[6];
58  struct flash_bank *master_bank = get_flash_bank_by_name_noprobe(bank_name);
59 
60  if (!master_bank) {
61  LOG_ERROR("master flash bank '%s' does not exist", bank_name);
63  }
64 
65  /* save master bank name - use this to get settings later */
66  bank->driver_priv = strdup(bank_name);
67 
68  return ERROR_OK;
69 }
70 
71 static int virtual_protect(struct flash_bank *bank, int set, unsigned int first,
72  unsigned int last)
73 {
74  struct flash_bank *master_bank = virtual_get_master_bank(bank);
75 
76  if (!master_bank)
78 
79  return flash_driver_protect(master_bank, set, first, last);
80 }
81 
83 {
84  struct flash_bank *master_bank = virtual_get_master_bank(bank);
85 
86  if (!master_bank)
88 
89  if (!master_bank->driver->protect_check)
91 
92  /* call master handler */
93  return master_bank->driver->protect_check(master_bank);
94 }
95 
96 static int virtual_erase(struct flash_bank *bank, unsigned int first,
97  unsigned int last)
98 {
99  struct flash_bank *master_bank = virtual_get_master_bank(bank);
100 
101  if (!master_bank)
103 
104  /* call master handler */
105  return master_bank->driver->erase(master_bank, first, last);
106 }
107 
108 static int virtual_write(struct flash_bank *bank, const uint8_t *buffer,
109  uint32_t offset, uint32_t count)
110 {
111  struct flash_bank *master_bank = virtual_get_master_bank(bank);
112 
113  if (!master_bank)
115 
116  /* call master handler */
117  return master_bank->driver->write(master_bank, buffer, offset, count);
118 }
119 
120 static int virtual_probe(struct flash_bank *bank)
121 {
122  struct flash_bank *master_bank = virtual_get_master_bank(bank);
123  int retval;
124 
125  if (!master_bank)
127 
128  /* call master handler */
129  retval = master_bank->driver->probe(master_bank);
130  if (retval != ERROR_OK)
131  return retval;
132 
133  /* update the info we do not have */
135 
136  return ERROR_OK;
137 }
138 
139 static int virtual_auto_probe(struct flash_bank *bank)
140 {
141  struct flash_bank *master_bank = virtual_get_master_bank(bank);
142  int retval;
143 
144  if (!master_bank)
146 
147  /* call master handler */
148  retval = master_bank->driver->auto_probe(master_bank);
149  if (retval != ERROR_OK)
150  return retval;
151 
152  /* update the info we do not have */
154 
155  return ERROR_OK;
156 }
157 
158 static int virtual_info(struct flash_bank *bank, struct command_invocation *cmd)
159 {
160  struct flash_bank *master_bank = virtual_get_master_bank(bank);
161 
162  if (!master_bank)
164 
165  command_print_sameline(cmd, "%s driver for flash bank %s at " TARGET_ADDR_FMT,
166  bank->driver->name, master_bank->name, master_bank->base);
167 
168  return ERROR_OK;
169 }
170 
172 {
173  struct flash_bank *master_bank = virtual_get_master_bank(bank);
174 
175  if (!master_bank)
177 
178  /* call master handler */
179  return master_bank->driver->erase_check(master_bank);
180 }
181 
182 static int virtual_flash_read(struct flash_bank *bank,
183  uint8_t *buffer, uint32_t offset, uint32_t count)
184 {
185  struct flash_bank *master_bank = virtual_get_master_bank(bank);
186 
187  if (!master_bank)
189 
190  /* call master handler */
191  return master_bank->driver->read(master_bank, buffer, offset, count);
192 }
193 
195 {
196  free(bank->driver_priv);
197  bank->driver_priv = NULL;
198 
199  /* For 'virtual' flash driver bank->sectors and bank->prot_blocks pointers are copied from
200  * master flash_bank structure. They point to memory locations allocated by master flash driver
201  * so master driver is responsible for releasing them.
202  * Avoid UB caused by double-free memory corruption if flash bank is 'virtual'. */
203  bank->sectors = NULL;
204  bank->prot_blocks = NULL;
205 }
206 
207 const struct flash_driver virtual_flash = {
208  .name = "virtual",
209  .flash_bank_command = virtual_flash_bank_command,
210  .erase = virtual_erase,
211  .protect = virtual_protect,
212  .write = virtual_write,
213  .read = virtual_flash_read,
214  .probe = virtual_probe,
215  .auto_probe = virtual_auto_probe,
216  .erase_check = virtual_blank_check,
217  .protect_check = virtual_protect_check,
218  .info = virtual_info,
219  .free_driver_priv = virtual_flash_free_driver_priv,
220 };
221 
222 FLASH_BANK_COMMAND_HANDLER(ro_alias_bank_command)
223 {
224  if (CMD_ARGC < 7)
226 
227  // get the master flash bank
228  const char *bank_name = CMD_ARGV[6];
229  struct flash_bank *master_bank = get_flash_bank_by_name_noprobe(bank_name);
230 
231  if (!master_bank) {
232  LOG_ERROR("master flash bank '%s' does not exist", bank_name);
234  }
235 
236  // save master bank name - use this to get settings later
237  bank->driver_priv = strdup(bank_name);
238 
239  bank->read_only = true;
240 
241  return ERROR_OK;
242 }
243 
244 static int ro_alias_erase(struct flash_bank *bank,
245  unsigned int first, unsigned int last)
246 {
247  char *bank_name = bank->driver_priv;
248 
249  LOG_ERROR("Erase of read-only flash alias refused. Use master flash bank '%s'",
250  bank_name);
251 
252  return ERROR_FAIL;
253 }
254 
255 static int ro_alias_write(struct flash_bank *bank, const uint8_t *buffer,
256  uint32_t offset, uint32_t count)
257 {
258  char *bank_name = bank->driver_priv;
259 
260  LOG_ERROR("Write to read-only flash alias refused. Use master flash bank '%s'",
261  bank_name);
262 
263  return ERROR_FAIL;
264 }
265 
266 const struct flash_driver ro_alias_flash = {
267  .name = "ro_alias",
268  .flash_bank_command = ro_alias_bank_command,
269  .erase = ro_alias_erase,
270  .write = ro_alias_write,
271  .read = virtual_flash_read,
272  .probe = virtual_probe,
273  .auto_probe = virtual_auto_probe,
274  .erase_check = virtual_blank_check,
275  .info = virtual_info,
276  .free_driver_priv = virtual_flash_free_driver_priv,
277 };
void command_print_sameline(struct command_invocation *cmd, const char *format,...)
Definition: command.c:378
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
Definition: command.h:161
#define ERROR_COMMAND_SYNTAX_ERROR
Definition: command.h:405
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
Definition: command.h:156
uint64_t buffer
Pointer to data buffer to send over SPI.
Definition: dw-spi-helper.h:0
uint8_t bank
Definition: esirisc.c:135
#define ERROR_FLASH_OPER_UNSUPPORTED
Definition: flash/common.h:36
#define ERROR_FLASH_OPERATION_FAILED
Definition: flash/common.h:30
struct flash_bank * get_flash_bank_by_name_noprobe(const char *name)
Returns the flash bank specified by name, which matches the driver name and a suffix (option) specify...
int flash_driver_protect(struct flash_bank *bank, int set, unsigned int first, unsigned int last)
#define ERROR_FAIL
Definition: log.h:188
#define LOG_ERROR(expr ...)
Definition: log.h:147
#define ERROR_OK
Definition: log.h:182
When run_command is called, a new instance will be created on the stack, filled with the proper value...
Definition: command.h:76
Provides details of a flash bank, available either on-chip or through a major interface.
Definition: nor/core.h:75
uint32_t write_end_alignment
Required alignment of flash write end address.
Definition: nor/core.h:104
unsigned int num_prot_blocks
The number of protection blocks in this bank.
Definition: nor/core.h:126
struct flash_sector * sectors
Array of sectors, allocated and initialized by the flash driver.
Definition: nor/core.h:118
uint8_t default_padded_value
Default padded value used, normally this matches the flash erased value.
Definition: nor/core.h:97
const struct flash_driver * driver
Driver for this bank.
Definition: nor/core.h:80
unsigned int chip_width
Width of the chip in bytes (1,2,4 bytes)
Definition: nor/core.h:89
target_addr_t base
The base address of this bank.
Definition: nor/core.h:84
uint32_t size
The size of this chip bank, in bytes.
Definition: nor/core.h:85
unsigned int num_sectors
The number of sectors on this chip.
Definition: nor/core.h:116
uint32_t write_start_alignment
Required alignment of flash write start address.
Definition: nor/core.h:101
struct flash_sector * prot_blocks
Array of protection blocks, allocated and initialized by the flash driver.
Definition: nor/core.h:128
unsigned int bus_width
Maximum bus width, in bytes (1,2,4 bytes)
Definition: nor/core.h:90
uint32_t minimal_write_gap
Minimal gap between sections to discontinue flash write Default FLASH_WRITE_GAP_SECTOR splits the wri...
Definition: nor/core.h:109
char * name
Definition: nor/core.h:76
uint8_t erased_value
Erased value.
Definition: nor/core.h:93
Provides the implementation-independent structure that defines all of the callbacks required by OpenO...
Definition: nor/driver.h:39
int(* auto_probe)(struct flash_bank *bank)
A more gentle flavor of flash_driver::probe, performing setup with less noise.
Definition: nor/driver.h:219
int(* erase_check)(struct flash_bank *bank)
Check the erasure status of a flash bank.
Definition: nor/driver.h:179
int(* write)(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
Program data into the flash.
Definition: nor/driver.h:130
int(* probe)(struct flash_bank *bank)
Probe to determine what kind of flash is present.
Definition: nor/driver.h:168
int(* erase)(struct flash_bank *bank, unsigned int first, unsigned int last)
Bank/sector erase routine (target-specific).
Definition: nor/driver.h:96
int(* read)(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
Read data from the flash.
Definition: nor/driver.h:144
int(* protect_check)(struct flash_bank *bank)
Determine if the specific bank is "protected" or not.
Definition: nor/driver.h:193
const char * name
Gives a human-readable name of this flash driver, This field is used to select and initialize the dri...
Definition: nor/driver.h:44
#define TARGET_ADDR_FMT
Definition: types.h:286
#define NULL
Definition: usb.h:16
uint8_t cmd
Definition: vdebug.c:1
uint8_t offset[4]
Definition: vdebug.c:9
uint8_t count[4]
Definition: vdebug.c:22
static int virtual_protect_check(struct flash_bank *bank)
Definition: virtual.c:82
FLASH_BANK_COMMAND_HANDLER(virtual_flash_bank_command)
Definition: virtual.c:51
static int virtual_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
Definition: virtual.c:108
static int virtual_protect(struct flash_bank *bank, int set, unsigned int first, unsigned int last)
Definition: virtual.c:71
static struct flash_bank * virtual_get_master_bank(struct flash_bank *bank)
Definition: virtual.c:15
const struct flash_driver ro_alias_flash
Definition: virtual.c:266
static int virtual_probe(struct flash_bank *bank)
Definition: virtual.c:120
static int virtual_info(struct flash_bank *bank, struct command_invocation *cmd)
Definition: virtual.c:158
const struct flash_driver virtual_flash
Definition: virtual.c:207
static int virtual_flash_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
Definition: virtual.c:182
static int ro_alias_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
Definition: virtual.c:255
static int virtual_auto_probe(struct flash_bank *bank)
Definition: virtual.c:139
void virtual_flash_free_driver_priv(struct flash_bank *bank)
Definition: virtual.c:194
static void virtual_update_bank_info(struct flash_bank *bank)
Definition: virtual.c:26
static int virtual_blank_check(struct flash_bank *bank)
Definition: virtual.c:171
static int virtual_erase(struct flash_bank *bank, unsigned int first, unsigned int last)
Definition: virtual.c:96
static int ro_alias_erase(struct flash_bank *bank, unsigned int first, unsigned int last)
Definition: virtual.c:244