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  if (!master_bank->driver->erase)
106 
107  /* call master handler */
108  return master_bank->driver->erase(master_bank, first, last);
109 }
110 
111 static int virtual_write(struct flash_bank *bank, const uint8_t *buffer,
112  uint32_t offset, uint32_t count)
113 {
114  struct flash_bank *master_bank = virtual_get_master_bank(bank);
115 
116  if (!master_bank)
118 
119  /* call master handler */
120  return master_bank->driver->write(master_bank, buffer, offset, count);
121 }
122 
123 static int virtual_probe(struct flash_bank *bank)
124 {
125  struct flash_bank *master_bank = virtual_get_master_bank(bank);
126  int retval;
127 
128  if (!master_bank)
130 
131  /* call master handler */
132  retval = master_bank->driver->probe(master_bank);
133  if (retval != ERROR_OK)
134  return retval;
135 
136  /* update the info we do not have */
138 
139  return ERROR_OK;
140 }
141 
142 static int virtual_auto_probe(struct flash_bank *bank)
143 {
144  struct flash_bank *master_bank = virtual_get_master_bank(bank);
145  int retval;
146 
147  if (!master_bank)
149 
150  /* call master handler */
151  retval = master_bank->driver->auto_probe(master_bank);
152  if (retval != ERROR_OK)
153  return retval;
154 
155  /* update the info we do not have */
157 
158  return ERROR_OK;
159 }
160 
161 static int virtual_info(struct flash_bank *bank, struct command_invocation *cmd)
162 {
163  struct flash_bank *master_bank = virtual_get_master_bank(bank);
164 
165  if (!master_bank)
167 
168  command_print_sameline(cmd, "%s driver for flash bank %s at " TARGET_ADDR_FMT,
169  bank->driver->name, master_bank->name, master_bank->base);
170 
171  return ERROR_OK;
172 }
173 
175 {
176  struct flash_bank *master_bank = virtual_get_master_bank(bank);
177 
178  if (!master_bank)
180 
181  /* call master handler or default */
182  if (master_bank->driver->erase_check)
183  return master_bank->driver->erase_check(master_bank);
184 
185  return default_flash_blank_check(master_bank);
186 }
187 
188 static int virtual_flash_read(struct flash_bank *bank,
189  uint8_t *buffer, uint32_t offset, uint32_t count)
190 {
191  struct flash_bank *master_bank = virtual_get_master_bank(bank);
192 
193  if (!master_bank)
195 
196  /* call master handler or default */
197  if (master_bank->driver->read)
198  return master_bank->driver->read(master_bank, buffer, offset, count);
199 
200  return default_flash_read(master_bank, buffer, offset, count);
201 }
202 
204 {
205  free(bank->driver_priv);
206  bank->driver_priv = NULL;
207 
208  /* For 'virtual' flash driver bank->sectors and bank->prot_blocks pointers are copied from
209  * master flash_bank structure. They point to memory locations allocated by master flash driver
210  * so master driver is responsible for releasing them.
211  * Avoid UB caused by double-free memory corruption if flash bank is 'virtual'. */
212  bank->sectors = NULL;
213  bank->prot_blocks = NULL;
214 }
215 
216 const struct flash_driver virtual_flash = {
217  .name = "virtual",
218  .flash_bank_command = virtual_flash_bank_command,
219  .erase = virtual_erase,
220  .protect = virtual_protect,
221  .write = virtual_write,
222  .read = virtual_flash_read,
223  .probe = virtual_probe,
224  .auto_probe = virtual_auto_probe,
225  .erase_check = virtual_blank_check,
226  .protect_check = virtual_protect_check,
227  .info = virtual_info,
228  .free_driver_priv = virtual_flash_free_driver_priv,
229 };
230 
231 FLASH_BANK_COMMAND_HANDLER(ro_alias_bank_command)
232 {
233  if (CMD_ARGC < 7)
235 
236  // get the master flash bank
237  const char *bank_name = CMD_ARGV[6];
238  struct flash_bank *master_bank = get_flash_bank_by_name_noprobe(bank_name);
239 
240  if (!master_bank) {
241  LOG_ERROR("master flash bank '%s' does not exist", bank_name);
243  }
244 
245  // save master bank name - use this to get settings later
246  bank->driver_priv = strdup(bank_name);
247 
248  bank->read_only = true;
249 
250  return ERROR_OK;
251 }
252 
253 static int ro_alias_erase(struct flash_bank *bank,
254  unsigned int first, unsigned int last)
255 {
256  char *bank_name = bank->driver_priv;
257 
258  LOG_ERROR("Erase of read-only flash alias refused. Use master flash bank '%s'",
259  bank_name);
260 
261  return ERROR_FAIL;
262 }
263 
264 static int ro_alias_write(struct flash_bank *bank, const uint8_t *buffer,
265  uint32_t offset, uint32_t count)
266 {
267  char *bank_name = bank->driver_priv;
268 
269  LOG_ERROR("Write to read-only flash alias refused. Use master flash bank '%s'",
270  bank_name);
271 
272  return ERROR_FAIL;
273 }
274 
275 const struct flash_driver ro_alias_flash = {
276  .name = "ro_alias",
277  .flash_bank_command = ro_alias_bank_command,
278  .erase = ro_alias_erase,
279  .write = ro_alias_write,
280  .read = virtual_flash_read,
281  .probe = virtual_probe,
282  .auto_probe = virtual_auto_probe,
283  .erase_check = virtual_blank_check,
284  .info = virtual_info,
285  .free_driver_priv = virtual_flash_free_driver_priv,
286 };
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)
int default_flash_blank_check(struct flash_bank *bank)
Provides default erased-bank check handling.
int default_flash_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
Provides default read implementation for flash memory.
#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:137
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:139
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:231
int(* erase_check)(struct flash_bank *bank)
Check the erasure status of a flash bank.
Definition: nor/driver.h:191
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:133
int(* probe)(struct flash_bank *bank)
Probe to determine what kind of flash is present.
Definition: nor/driver.h:177
int(* erase)(struct flash_bank *bank, unsigned int first, unsigned int last)
Bank/sector erase routine (target-specific).
Definition: nor/driver.h:99
int(* read)(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
Read data from the flash.
Definition: nor/driver.h:150
int(* protect_check)(struct flash_bank *bank)
Determine if the specific bank is "protected" or not.
Definition: nor/driver.h:205
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:111
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:275
static int virtual_probe(struct flash_bank *bank)
Definition: virtual.c:123
static int virtual_info(struct flash_bank *bank, struct command_invocation *cmd)
Definition: virtual.c:161
const struct flash_driver virtual_flash
Definition: virtual.c:216
static int virtual_flash_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
Definition: virtual.c:188
static int ro_alias_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
Definition: virtual.c:264
static int virtual_auto_probe(struct flash_bank *bank)
Definition: virtual.c:142
void virtual_flash_free_driver_priv(struct flash_bank *bank)
Definition: virtual.c:203
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:174
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:253