2 Copyright (c) 2020 Peter Hsu. All Rights Reserved. See LICENCE file for details.
12 #define RISCV_PGSHIFT 12
13 #define RISCV_PGSIZE (1 << RISCV_PGSHIFT)
15 #define ROUNDUP(a, b) ((((a)-1)/(b)+1)*(b))
16 #define ROUNDDOWN(a, b) ((a)/(b)*(b))
20 #define GEN_SEGV (*((char*)0) = 0)
41 enum Opcode_t op_code
: 16;
42 uint8_t op_rd
; // 0..31 = integer registers
43 uint8_t op_rs1
; // 32..63 = floating point registers
48 uint8_t rs2
; // 64 = not valid
49 uint8_t rs3
; // only for floating multiply-add
54 #define ZERO 0 // Register x0 always zero
55 #define RA 1 // Standard RISC-V ABI convention
63 const char* name
; /* asserbler opcode */
64 unsigned int flags
; /* upper case, from Instructions.def */
65 enum units_t unit
: 8; /* lower case, functional units */
66 unsigned char latency
; /* filled in by simulator */
71 struct insn_t
* insn_array
;
76 /* Process information */
89 extern struct pinfo_t current
;
92 extern struct insnSpace_t insnSpace
;
93 extern struct insnAttr_t insnAttr
[]; /* Attribute array indexed by Opcode_t */
94 extern const char* regName
[];
98 void insnSpace_init();
99 void decode_instruction( const struct insn_t
* p
, Addr_t PC
);
101 Addr_t
load_elf_binary( const char* file_name
, int include_data
);
102 Addr_t
initialize_stack( int argc
, const char** argv
, const char** envp
);
103 int find_symbol( const char* name
, Addr_t
* begin
, Addr_t
* end
);
104 int find_pc( long pc
, const char** name
, long* offset
);
107 #define insn(pc) ( &insnSpace.insn_array[(pc-insnSpace.base)/2] )
109 static inline int valid_pc(Addr_t pc
)
111 return insnSpace
.base
<= pc
&& pc
< insnSpace
.bound
;
114 static inline void insert_breakpoint(Addr_t pc
)
116 assert(valid_pc(pc
));
117 struct insn_t
* p
= &insnSpace
.insn_array
[(pc
-insnSpace
.base
)/2];
118 if (shortOp(p
->op_code
))
119 p
->op_code
= Op_c_ebreak
;
121 p
->op_code
= Op_ebreak
;
125 int find_symbol( const char* name
, long* begin_addr
, long* end_addr
);
127 returns TRUE or FALSE found in ELF symbol table
128 name - function or variable
129 begin_addr - pointer to where addresses will be written
130 end_addr - writes NULL if symbol not found
134 void print_symbol( long address
, FILE* output_file
);
136 Prints address as name+hex
137 address - in text or data segment
138 output_file - writes to this file
141 int format_pc(char* buf
, int width
, Addr_t pc
);
144 void print_pc( long pc
, FILE* output_file
);
146 Print symbolic program counter
147 pc - program counter in text segment
148 file_descr - write to this file descriptor
151 int format_insn( char* buf
, const struct insn_t
* p
, long pc
, unsigned int image
);
153 Disassemble instruction into buffer
154 returns length of string in buf
155 buf - buffer to hold disassembled text
157 pc - program counter in text segment
160 void print_insn( long address
, FILE* output_file
);
162 Disassemble instruction and print
163 address - program counter in text segment
164 file_descr - write to this file descriptor
167 void print_registers( struct reg_t regs
[], FILE* output_file
);
170 regs - register files, IR+FR
171 file_descr - write to this file descriptor