OpenOCD
esp_algorithm.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 /***************************************************************************
4  * Espressif chips common algorithm API for OpenOCD *
5  * Copyright (C) 2022 Espressif Systems Ltd. *
6  ***************************************************************************/
7 
8 #ifndef OPENOCD_TARGET_ESP_ALGORITHM_H
9 #define OPENOCD_TARGET_ESP_ALGORITHM_H
10 
11 #include "helper/log.h"
12 #include "helper/binarybuffer.h"
13 #include <helper/time_support.h>
14 #include <target/algorithm.h>
15 #include <target/image.h>
16 
121  struct image image;
123  uint32_t bss_size;
125  uint32_t iram_org;
127  uint32_t iram_len;
129  uint32_t dram_org;
131  uint32_t dram_len;
133  bool reverse;
134 };
135 
136 #define ESP_IMAGE_ELF_PHF_EXEC 0x1
137 
165  uint32_t log_buff_size;
167  void *ainfo;
168 };
169 
175  struct mem_param *params;
177  uint32_t count;
178 };
179 
185  struct reg_param *params;
187  uint32_t count;
191 };
192 
194 
196  int (*algo_init)(struct target *target, struct esp_algorithm_run_data *run, uint32_t num_args, va_list ap);
197  int (*algo_cleanup)(struct target *target, struct esp_algorithm_run_data *run);
198  const uint8_t *(*stub_tramp_get)(struct target *target, size_t *size);
199 };
200 
206  uint32_t timeout_ms;
208  uint32_t stack_size;
214  void *arch_info;
216  int32_t ret_code;
218  struct esp_algorithm_stub stub;
219  union {
220  struct {
222  uint32_t code_buf_size;
226  uint32_t min_stack_size;
230  struct esp_algorithm_image image;
231  };
234 
245  int (*usr_func)(struct target *target, void *usr_arg);
246 
259  int (*usr_func_init)(struct target *target,
260  struct esp_algorithm_run_data *run,
261  void *usr_arg);
262 
274  void (*usr_func_done)(struct target *target,
275  struct esp_algorithm_run_data *run,
276  void *usr_arg);
277 
287  int (*algo_func)(struct target *target, struct esp_algorithm_run_data *run, void *arg);
288 
290  const struct esp_algorithm_hw *hw;
291 };
292 
295 
297  struct esp_algorithm_run_data *run,
298  uint32_t num_args,
299  va_list ap);
300 
312  struct esp_algorithm_run_data *run,
313  uint32_t num_args,
314  va_list ap)
315 {
316  int ret = esp_algorithm_load_func_image(target, run);
317  if (ret != ERROR_OK)
318  return ret;
319  ret = esp_algorithm_exec_func_image_va(target, run, num_args, ap);
321  return ret != ERROR_OK ? ret : rc;
322 }
323 
324 static inline int esp_algorithm_run_func_image(struct target *target,
325  struct esp_algorithm_run_data *run,
326  uint32_t num_args,
327  ...)
328 {
329  va_list ap;
330  va_start(ap, num_args);
331  int retval = esp_algorithm_run_func_image_va(target, run, num_args, ap);
332  va_end(ap);
333  return retval;
334 }
335 
337  target_addr_t func_addr,
338  struct esp_algorithm_run_data *run);
341  struct esp_algorithm_run_data *run,
342  uint32_t num_args,
343  va_list ap);
344 
357  struct esp_algorithm_run_data *run,
358  target_addr_t func_addr,
359  uint32_t num_args,
360  va_list ap)
361 {
362  int ret = esp_algorithm_load_onboard_func(target, func_addr, run);
363  if (ret != ERROR_OK)
364  return ret;
365  ret = esp_algorithm_exec_onboard_func_va(target, run, num_args, ap);
366  if (ret != ERROR_OK)
367  return ret;
369 }
370 
371 static inline int esp_algorithm_run_onboard_func(struct target *target,
372  struct esp_algorithm_run_data *run,
373  target_addr_t func_addr,
374  uint32_t num_args,
375  ...)
376 {
377  va_list ap;
378  va_start(ap, num_args);
379  int retval = esp_algorithm_run_onboard_func_va(target, run, func_addr, num_args, ap);
380  va_end(ap);
381  return retval;
382 }
383 
388  int arg_num,
389  uint64_t val)
390 {
391  struct reg_param *param = &run->reg_args.params[run->reg_args.first_user_param + arg_num];
392 
393  assert(param->size <= 64);
394 
395  if (param->size <= 32)
396  buf_set_u32(param->value, 0, param->size, val);
397  else
398  buf_set_u64(param->value, 0, param->size, val);
399 }
400 
404 static inline uint64_t esp_algorithm_user_arg_get_uint(struct esp_algorithm_run_data *run, int arg_num)
405 {
406  struct reg_param *param = &run->reg_args.params[run->reg_args.first_user_param + arg_num];
407 
408  assert(param->size <= 64);
409 
410  if (param->size <= 32)
411  return buf_get_u32(param->value, 0, param->size);
412  return buf_get_u64(param->value, 0, param->size);
413 }
414 
415 #endif /* OPENOCD_TARGET_ESP_ALGORITHM_H */
Support functions to access arbitrary bits in a byte array.
static uint32_t buf_get_u32(const uint8_t *_buffer, unsigned int first, unsigned int num)
Retrieves num bits from _buffer, starting at the first bit, returning the bits in a 32-bit word.
Definition: binarybuffer.h:104
static void buf_set_u32(uint8_t *_buffer, unsigned int first, unsigned int num, uint32_t value)
Sets num bits in _buffer, starting at the first bit, using the bits in value.
Definition: binarybuffer.h:34
static uint64_t buf_get_u64(const uint8_t *_buffer, unsigned int first, unsigned int num)
Retrieves num bits from _buffer, starting at the first bit, returning the bits in a 64-bit word.
Definition: binarybuffer.h:134
static void buf_set_u64(uint8_t *_buffer, unsigned int first, unsigned int num, uint64_t value)
Sets num bits in _buffer, starting at the first bit, using the bits in value.
Definition: binarybuffer.h:65
uint32_t size
Size of dw_spi_transaction::buffer.
Definition: dw-spi-helper.h:4
static int esp_algorithm_run_onboard_func(struct target *target, struct esp_algorithm_run_data *run, target_addr_t func_addr, uint32_t num_args,...)
int esp_algorithm_exec_onboard_func_va(struct target *target, struct esp_algorithm_run_data *run, uint32_t num_args, va_list ap)
static uint64_t esp_algorithm_user_arg_get_uint(struct esp_algorithm_run_data *run, int arg_num)
Get the value of an argument passed via registers from the stub main function.
static int esp_algorithm_run_func_image_va(struct target *target, struct esp_algorithm_run_data *run, uint32_t num_args, va_list ap)
Loads and runs stub from specified image.
static int esp_algorithm_run_onboard_func_va(struct target *target, struct esp_algorithm_run_data *run, target_addr_t func_addr, uint32_t num_args, va_list ap)
Runs pre-compiled on-board function.
int esp_algorithm_load_func_image(struct target *target, struct esp_algorithm_run_data *run)
int esp_algorithm_unload_onboard_func(struct target *target, struct esp_algorithm_run_data *run)
int esp_algorithm_unload_func_image(struct target *target, struct esp_algorithm_run_data *run)
static int esp_algorithm_run_func_image(struct target *target, struct esp_algorithm_run_data *run, uint32_t num_args,...)
int esp_algorithm_exec_func_image_va(struct target *target, struct esp_algorithm_run_data *run, uint32_t num_args, va_list ap)
int esp_algorithm_load_onboard_func(struct target *target, target_addr_t func_addr, struct esp_algorithm_run_data *run)
static void esp_algorithm_user_arg_set_uint(struct esp_algorithm_run_data *run, int arg_num, uint64_t val)
Set the value of an argument passed via registers to the stub main function.
#define ERROR_OK
Definition: log.h:167
struct target * target
Definition: rtt/rtt.c:26
int(* algo_init)(struct target *target, struct esp_algorithm_run_data *run, uint32_t num_args, va_list ap)
int(* algo_cleanup)(struct target *target, struct esp_algorithm_run_data *run)
API defined below allows executing pieces of code on target without breaking the execution of the run...
uint32_t iram_len
Total reserved IRAM size.
bool reverse
IRAM DRAM address range reversed or not.
uint32_t bss_size
BSS section size.
uint32_t dram_len
Total reserved DRAM size.
uint32_t dram_org
DRAM start address in the linker script.
uint32_t iram_org
IRAM start address in the linker script.
Algorithm stub in-memory arguments.
uint32_t count
Number of memory params.
struct mem_param * params
Memory params.
Algorithm stub register arguments.
struct reg_param * params
Algorithm register params.
uint32_t first_user_param
The first several reg_params can be used by stub itself (e.g.
uint32_t count
Number of register params.
Algorithm run data.
struct esp_algorithm_run_data::@96::@98 on_board
target_addr_t min_stack_addr
Pre-compiled target buffer's addr for stack.
struct esp_algorithm_reg_args reg_args
Algorithm register arguments.
struct esp_algorithm_mem_args mem_args
Algorithm memory arguments.
void * usr_func_arg
Host side algorithm function argument.
void * arch_info
Algorithm arch-specific info.
uint32_t timeout_ms
Algorithm completion timeout in ms.
const struct esp_algorithm_hw * hw
HW specific API.
void(* usr_func_done)(struct target *target, struct esp_algorithm_run_data *run, void *usr_arg)
Algorithm's arguments cleanup function.
struct esp_algorithm_stub stub
Stub.
uint32_t min_stack_size
Size of the pre-alocated on-board buffer for stub's stack.
uint32_t stack_size
Algorithm stack size.
int(* usr_func_init)(struct target *target, struct esp_algorithm_run_data *run, void *usr_arg)
Algorithm's arguments setup function.
int32_t ret_code
Algorithm return code.
target_addr_t code_buf_addr
Address of pre-compiled target buffer for stub trampoline.
int(* usr_func)(struct target *target, void *usr_arg)
Host part of algorithm.
int(* algo_func)(struct target *target, struct esp_algorithm_run_data *run, void *arg)
Algorithm run function.
uint32_t code_buf_size
Size of the pre-alocated on-board buffer for stub's code.
Algorithm stub data.
target_addr_t stack_addr
Address of the target buffer for stack.
target_addr_t tramp_addr
Address of the target buffer for stub trampoline.
void * ainfo
Algorithm's arch-specific info.
uint32_t log_buff_size
Size of the log buffer.
struct working_area * padding
Working area for padding between code and data area.
target_addr_t tramp_mapped_addr
Tramp code area will be filled from dbus.
struct working_area * data
Working area for data segment.
struct working_area * tramp
Working area for trampoline.
target_addr_t log_buff_addr
Address of the log buffer.
struct working_area * stack
Working area for stack.
target_addr_t entry
Entry addr.
struct working_area * code
Working area for code segment.
Definition: image.h:48
uint32_t size
Definition: algorithm.h:29
uint8_t * value
Definition: algorithm.h:30
Definition: target.h:116
uint64_t target_addr_t
Definition: types.h:335