OpenOCD
program.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #ifndef OPENOCD_TARGET_RISCV_PROGRAM_H
4 #define OPENOCD_TARGET_RISCV_PROGRAM_H
5 
6 #include "riscv.h"
7 
8 #define RISCV013_MAX_PROGBUF_SIZE 16
9 
16 };
17 
18 /* The various RISC-V debug specifications all revolve around setting up
19  * program buffers and executing them on the target. This structure contains a
20  * single program, which can then be executed on targets. */
21 struct riscv_program {
22  struct target *target;
23 
25 
26  /* Number of 32-bit instructions in the program. */
27  unsigned int instruction_count;
28 
29  /* execution result of the program */
30  /* TODO: remove this field. We should make it a parameter to riscv_program_exec */
32 };
33 
34 /* Initializes a program with the header. */
35 int riscv_program_init(struct riscv_program *p, struct target *t);
36 
37 /* Write the program to the program buffer. */
38 int riscv_program_write(struct riscv_program *program);
39 
40 /* Executes a program, returning 0 if the program successfully executed. Note
41  * that this may cause registers to be saved or restored, which could result to
42  * calls to things like riscv013_reg_save which itself could require a
43  * program to execute. That's OK, just make sure this eventually terminates.
44  * */
45 int riscv_program_exec(struct riscv_program *p, struct target *t);
46 
47 /* A lower level interface, you shouldn't use this unless you have a reason. */
49 
50 /* Helpers to assemble various instructions. Return 0 on success. These might
51  * assemble into a multi-instruction sequence that overwrites some other
52  * register, but those will be properly saved and restored. */
53 int riscv_program_ldr(struct riscv_program *p, enum gdb_regno d, enum gdb_regno a, int16_t o);
54 int riscv_program_lwr(struct riscv_program *p, enum gdb_regno d, enum gdb_regno a, int16_t o);
55 int riscv_program_lhr(struct riscv_program *p, enum gdb_regno d, enum gdb_regno a, int16_t o);
56 int riscv_program_lbr(struct riscv_program *p, enum gdb_regno d, enum gdb_regno a, int16_t o);
57 int riscv_program_load(struct riscv_program *p, enum gdb_regno d, enum gdb_regno b, int16_t o,
58  unsigned int s);
59 
60 int riscv_program_sdr(struct riscv_program *p, enum gdb_regno s, enum gdb_regno a, int16_t o);
61 int riscv_program_swr(struct riscv_program *p, enum gdb_regno s, enum gdb_regno a, int16_t o);
62 int riscv_program_shr(struct riscv_program *p, enum gdb_regno s, enum gdb_regno a, int16_t o);
63 int riscv_program_sbr(struct riscv_program *p, enum gdb_regno s, enum gdb_regno a, int16_t o);
64 int riscv_program_store(struct riscv_program *p, enum gdb_regno d, enum gdb_regno b, int16_t o,
65  unsigned int s);
66 
67 int riscv_program_csrrsi(struct riscv_program *p, enum gdb_regno d, uint8_t z, enum gdb_regno csr);
68 int riscv_program_csrrci(struct riscv_program *p, enum gdb_regno d, uint8_t z, enum gdb_regno csr);
69 int riscv_program_csrr(struct riscv_program *p, enum gdb_regno d, enum gdb_regno csr);
70 int riscv_program_csrw(struct riscv_program *p, enum gdb_regno s, enum gdb_regno csr);
71 
74 int riscv_program_ebreak(struct riscv_program *p);
75 
76 int riscv_program_addi(struct riscv_program *p, enum gdb_regno d, enum gdb_regno s, int16_t i);
77 
78 #endif /* OPENOCD_TARGET_RISCV_PROGRAM_H */
uint8_t csr
Definition: esirisc.c:136
gdb_regno
Definition: gdb_regs.h:10
int riscv_program_fence_i(struct riscv_program *p)
Definition: program.c:171
int riscv_program_lbr(struct riscv_program *p, enum gdb_regno d, enum gdb_regno a, int16_t o)
Definition: program.c:125
int riscv_program_write(struct riscv_program *program)
Definition: program.c:30
int riscv_program_fence_rw_rw(struct riscv_program *p)
Definition: program.c:176
#define RISCV013_MAX_PROGBUF_SIZE
Definition: program.h:8
int riscv_program_shr(struct riscv_program *p, enum gdb_regno s, enum gdb_regno a, int16_t o)
Definition: program.c:83
int riscv_program_swr(struct riscv_program *p, enum gdb_regno s, enum gdb_regno a, int16_t o)
Definition: program.c:78
int riscv_program_csrrsi(struct riscv_program *p, enum gdb_regno d, uint8_t z, enum gdb_regno csr)
Definition: program.c:147
int riscv_program_sbr(struct riscv_program *p, enum gdb_regno s, enum gdb_regno a, int16_t o)
Definition: program.c:88
int riscv_program_csrrci(struct riscv_program *p, enum gdb_regno d, uint8_t z, enum gdb_regno csr)
Definition: program.c:153
int riscv_program_addi(struct riscv_program *p, enum gdb_regno d, enum gdb_regno s, int16_t i)
Definition: program.c:192
int riscv_program_store(struct riscv_program *p, enum gdb_regno d, enum gdb_regno b, int16_t o, unsigned int s)
Definition: program.c:93
int riscv_program_lwr(struct riscv_program *p, enum gdb_regno d, enum gdb_regno a, int16_t o)
Definition: program.c:115
int riscv_program_init(struct riscv_program *p, struct target *t)
Definition: program.c:17
int riscv_program_insert(struct riscv_program *p, riscv_insn_t i)
Definition: program.c:197
int riscv_program_lhr(struct riscv_program *p, enum gdb_regno d, enum gdb_regno a, int16_t o)
Definition: program.c:120
riscv_progbuf_exec_result
Definition: program.h:10
@ RISCV_PROGBUF_EXEC_RESULT_EXCEPTION
Definition: program.h:13
@ RISCV_PROGBUF_EXEC_RESULT_UNKNOWN
Definition: program.h:12
@ RISCV_PROGBUF_EXEC_RESULT_SUCCESS
Definition: program.h:15
@ RISCV_PROGBUF_EXEC_RESULT_NOT_EXECUTED
Definition: program.h:11
@ RISCV_PROGBUF_EXEC_RESULT_UNKNOWN_ERROR
Definition: program.h:14
int riscv_program_csrr(struct riscv_program *p, enum gdb_regno d, enum gdb_regno csr)
Definition: program.c:159
int riscv_program_csrw(struct riscv_program *p, enum gdb_regno s, enum gdb_regno csr)
Definition: program.c:165
int riscv_program_ldr(struct riscv_program *p, enum gdb_regno d, enum gdb_regno a, int16_t o)
Definition: program.c:110
int riscv_program_ebreak(struct riscv_program *p)
Definition: program.c:181
int riscv_program_sdr(struct riscv_program *p, enum gdb_regno s, enum gdb_regno a, int16_t o)
Definition: program.c:73
int riscv_program_exec(struct riscv_program *p, struct target *t)
Add ebreak and execute the program.
Definition: program.c:42
int riscv_program_load(struct riscv_program *p, enum gdb_regno d, enum gdb_regno b, int16_t o, unsigned int s)
Definition: program.c:130
uint32_t riscv_insn_t
Definition: riscv.h:47
enum riscv_progbuf_exec_result execution_result
Definition: program.h:31
struct target * target
Definition: program.h:22
uint32_t progbuf[RISCV013_MAX_PROGBUF_SIZE]
Definition: program.h:24
unsigned int instruction_count
Definition: program.h:27
Definition: target.h:119