Line 1... |
Line 1... |
/**
|
/*
|
* @file
|
* Copyright 2018 Sergey Khabarov, sergeykhbr@gmail.com
|
* @copyright Copyright 2016 GNSS Sensor Ltd. All right reserved.
|
*
|
* @author Sergey Khabarov - sergeykhbr@gmail.com
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* @brief RISC-V ISA specified structures and constants.
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
*/
|
*/
|
|
|
#ifndef __DEBUGGER_RISCV_ISA_H__
|
#ifndef __DEBUGGER_RISCV_ISA_H__
|
#define __DEBUGGER_RISCV_ISA_H__
|
#define __DEBUGGER_RISCV_ISA_H__
|
|
|
#include <inttypes.h>
|
#include <inttypes.h>
|
|
|
Line 79... |
Line 89... |
uint32_t imm20 : 1; // [31]
|
uint32_t imm20 : 1; // [31]
|
} bits;
|
} bits;
|
uint32_t value;
|
uint32_t value;
|
};
|
};
|
|
|
static const uint64_t EXT_SIGN_8 = 0xFFFFFFFFFFFFFF00LL;
|
/**
|
|
* Compressed extension types:
|
|
*/
|
|
|
|
// Regsiter
|
|
union ISA_CR_type {
|
|
struct bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t rs2 : 5; // [6:2]
|
|
uint16_t rdrs1 : 5; // [11:7]
|
|
uint16_t funct4 : 4; // [15:12]
|
|
} bits;
|
|
uint16_t value;
|
|
};
|
|
|
|
// Immediate
|
|
union ISA_CI_type {
|
|
struct bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t imm : 5; // [6:2]
|
|
uint16_t rdrs : 5; // [11:7]
|
|
uint16_t imm6 : 1; // [12]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} bits;
|
|
struct sp_bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t imm5 : 1; // [2]
|
|
uint16_t imm8_7 : 2; // [4:3]
|
|
uint16_t imm6 : 1; // [5]
|
|
uint16_t imm4 : 1; // [6]
|
|
uint16_t sp : 5; // [11:7]
|
|
uint16_t imm9 : 1; // [12]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} spbits;
|
|
struct ldsp_bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t off8_6 : 3; // [4:2]
|
|
uint16_t off4_3 : 2; // [6:5]
|
|
uint16_t rd : 5; // [11:7]
|
|
uint16_t off5 : 1; // [12]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} ldspbits;
|
|
struct lwsp_bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t off7_6 : 2; // [3:2]
|
|
uint16_t off4_2 : 3; // [6:4]
|
|
uint16_t rd : 5; // [11:7]
|
|
uint16_t off5 : 1; // [12]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} lwspbits;
|
|
uint16_t value;
|
|
};
|
|
|
|
// Stack relative Store
|
|
union ISA_CSS_type {
|
|
struct w_bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t rs2 : 5; // [6:2]
|
|
uint16_t imm7_6 : 2; // [8:7]
|
|
uint16_t imm5_2 : 4; // [12:9]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} wbits;
|
|
struct d_bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t rs2 : 5; // [6:2]
|
|
uint16_t imm8_6 : 3; // [9:7]
|
|
uint16_t imm5_3 : 3; // [12:10]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} dbits;
|
|
uint16_t value;
|
|
};
|
|
|
|
// Wide immediate
|
|
union ISA_CIW_type {
|
|
struct bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t rd : 3; // [4:2]
|
|
uint16_t imm3 : 1; // [5]
|
|
uint16_t imm2 : 1; // [6]
|
|
uint16_t imm9_6 : 4; // [10:7]
|
|
uint16_t imm5_4 : 2; // [12:11]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} bits;
|
|
uint16_t value;
|
|
};
|
|
|
|
// Load
|
|
union ISA_CL_type {
|
|
struct bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t rd : 3; // [4:2]
|
|
uint16_t imm6 : 1; // [5]
|
|
uint16_t imm27 : 1; // [6]
|
|
uint16_t rs1 : 3; // [9:7]
|
|
uint16_t imm5_3 : 3; // [12:10]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} bits;
|
|
uint16_t value;
|
|
};
|
|
|
|
// Store
|
|
union ISA_CS_type {
|
|
struct bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t rs2 : 3; // [4:2]
|
|
uint16_t imm6 : 1; // [5]
|
|
uint16_t imm27 : 1; // [6]
|
|
uint16_t rs1 : 3; // [9:7]
|
|
uint16_t imm5_3 : 3; // [12:10]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} bits;
|
|
uint16_t value;
|
|
};
|
|
|
|
// Branch
|
|
union ISA_CB_type {
|
|
struct bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t off5 : 1; // [2]
|
|
uint16_t off2_1 : 2; // [4:3]
|
|
uint16_t off7_6 : 2; // [6:5]
|
|
uint16_t rs1 : 3; // [9:7]
|
|
uint16_t off4_3 : 2; // [11:10]
|
|
uint16_t off8 : 1; // [12]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} bits;
|
|
struct sh_bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t shamt : 5; // [6:2]
|
|
uint16_t rd : 3; // [9:7]
|
|
uint16_t funct2 : 2; // [11:10]
|
|
uint16_t shamt5 : 1; // [12]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} shbits;
|
|
uint16_t value;
|
|
};
|
|
|
|
// Jump
|
|
union ISA_CJ_type {
|
|
struct bits_type {
|
|
uint16_t opcode : 2; // [1:0]
|
|
uint16_t off5 : 1; // [2]
|
|
uint16_t off3_1 : 3; // [5:3]
|
|
uint16_t off7 : 1; // [6]
|
|
uint16_t off6 : 1; // [7]
|
|
uint16_t off10 : 1; // [8]
|
|
uint16_t off9_8 : 2; // [10:9]
|
|
uint16_t off4 : 1; // [11]
|
|
uint16_t off11 : 1; // [12]
|
|
uint16_t funct3 : 3; // [15:13]
|
|
} bits;
|
|
uint16_t value;
|
|
};
|
|
|
|
|
|
static const uint64_t EXT_SIGN_5 = 0xFFFFFFFFFFFFFFF0LL;
|
|
static const uint64_t EXT_SIGN_6 = 0xFFFFFFFFFFFFFFE0LL;
|
|
static const uint64_t EXT_SIGN_8 = 0xFFFFFFFFFFFFFF80LL;
|
|
static const uint64_t EXT_SIGN_9 = 0xFFFFFFFFFFFFFF00LL;
|
|
static const uint64_t EXT_SIGN_11 = 0xFFFFFFFFFFFFF800LL;
|
static const uint64_t EXT_SIGN_12 = 0xFFFFFFFFFFFFF000LL;
|
static const uint64_t EXT_SIGN_12 = 0xFFFFFFFFFFFFF000LL;
|
static const uint64_t EXT_SIGN_16 = 0xFFFFFFFFFFFF0000LL;
|
static const uint64_t EXT_SIGN_16 = 0xFFFFFFFFFFFF0000LL;
|
static const uint64_t EXT_SIGN_32 = 0xFFFFFFFF00000000LL;
|
static const uint64_t EXT_SIGN_32 = 0xFFFFFFFF00000000LL;
|
|
|
static const char *const IREGS_NAMES[] = {
|
static const char *const IREGS_NAMES[] = {
|
Line 128... |
Line 297... |
"fs8", "fs9", "fs10", "fs11", "ft8", "ft9", "ft10", "ft11"
|
"fs8", "fs9", "fs10", "fs11", "ft8", "ft9", "ft10", "ft11"
|
};
|
};
|
|
|
enum ERegNames {
|
enum ERegNames {
|
Reg_Zero,
|
Reg_Zero,
|
Reg_ra,// = 1; // [1] Return address
|
Reg_ra, // [1] Return address
|
Reg_sp,// = 2; // [2] Stack pointer
|
Reg_sp, // [2] Stack pointer
|
Reg_gp,// = 3; // [3] Global pointer
|
Reg_gp, // [3] Global pointer
|
Reg_tp,// = 4; // [4] Thread pointer
|
Reg_tp, // [4] Thread pointer
|
Reg_t0,// = 5; // [5] Temporaries 0 s3
|
Reg_t0, // [5] Temporaries 0 s3
|
Reg_t1,// = 6; // [6] Temporaries 1 s4
|
Reg_t1, // [6] Temporaries 1 s4
|
Reg_t2,// = 7; // [7] Temporaries 2 s5
|
Reg_t2, // [7] Temporaries 2 s5
|
Reg_s0,// = 8; // [8] s0/fp Saved register/frame pointer
|
Reg_s0, // [8] s0/fp Saved register/frame pointer
|
Reg_s1,// = 9; // [9] Saved register 1
|
Reg_s1, // [9] Saved register 1
|
Reg_a0,// = 10; // [10] Function argumentes 0
|
Reg_a0, // [10] Function argumentes 0
|
Reg_a1,// = 11; // [11] Function argumentes 1
|
Reg_a1, // [11] Function argumentes 1
|
Reg_a2,// = 12; // [12] Function argumentes 2
|
Reg_a2, // [12] Function argumentes 2
|
Reg_a3,// = 13; // [13] Function argumentes 3
|
Reg_a3, // [13] Function argumentes 3
|
Reg_a4,// = 14; // [14] Function argumentes 4
|
Reg_a4, // [14] Function argumentes 4
|
Reg_a5,// = 15; // [15] Function argumentes 5
|
Reg_a5, // [15] Function argumentes 5
|
Reg_a6,// = 16; // [16] Function argumentes 6
|
Reg_a6, // [16] Function argumentes 6
|
Reg_a7,// = 17; // [17] Function argumentes 7
|
Reg_a7, // [17] Function argumentes 7
|
Reg_s2,// = 18; // [18] Saved register 2
|
Reg_s2, // [18] Saved register 2
|
Reg_s3,// = 19; // [19] Saved register 3
|
Reg_s3, // [19] Saved register 3
|
Reg_s4,// = 20; // [20] Saved register 4
|
Reg_s4, // [20] Saved register 4
|
Reg_s5,// = 21; // [21] Saved register 5
|
Reg_s5, // [21] Saved register 5
|
Reg_s6,// = 22; // [22] Saved register 6
|
Reg_s6, // [22] Saved register 6
|
Reg_s7,// = 23; // [23] Saved register 7
|
Reg_s7, // [23] Saved register 7
|
Reg_s8,// = 24; // [24] Saved register 8
|
Reg_s8, // [24] Saved register 8
|
Reg_s9,// = 25; // [25] Saved register 9
|
Reg_s9, // [25] Saved register 9
|
Reg_s10,// = 26; // [26] Saved register 10
|
Reg_s10, // [26] Saved register 10
|
Reg_s11,// = 27; // [27] Saved register 11
|
Reg_s11, // [27] Saved register 11
|
Reg_t3,// = 28; // [28]
|
Reg_t3, // [28]
|
Reg_t4,// = 29; // [29]
|
Reg_t4, // [29]
|
Reg_t5,// = 30; // [30]
|
Reg_t5, // [30]
|
Reg_t6,// = 31; // [31]
|
Reg_t6, // [31]
|
Reg_Total
|
Reg_Total
|
};
|
};
|
|
|
|
|
union csr_mstatus_type {
|
union csr_mstatus_type {
|
struct bits_type {
|
struct bits_type {
|
uint64_t UIE : 1; // [0]: User level interrupts ena for current priv. mode
|
uint64_t UIE : 1; // [0]: User level interrupts ena for current
|
uint64_t SIE : 1; // [1]: Super-User level interrupts ena for current priv. mode
|
// priv. mode
|
uint64_t HIE : 1; // [2]: Hypervisor level interrupts ena for current priv. mode
|
uint64_t SIE : 1; // [1]: Super-User level interrupts ena for
|
uint64_t MIE : 1; // [3]: Machine level interrupts ena for current priv. mode
|
// current priv. mode
|
uint64_t UPIE : 1; // [4]: User level interrupts ena previous value (before interrupt)
|
uint64_t HIE : 1; // [2]: Hypervisor level interrupts ena for
|
uint64_t SPIE : 1; // [5]: Super-User level interrupts ena previous value (before interrupt)
|
// current priv. mode
|
uint64_t HPIE : 1; // [6]: Hypervisor level interrupts ena previous value (before interrupt)
|
uint64_t MIE : 1; // [3]: Machine level interrupts ena for
|
uint64_t MPIE : 1; // [7]: Machine level interrupts ena previous value (before interrupt)
|
// current priv. mode
|
uint64_t SPP : 1; // [8]: One bit wide. Supper-user previously priviledged level
|
uint64_t UPIE : 1; // [4]: User level interrupts ena previous
|
uint64_t HPP : 2; // [10:9]: the Hypervisor previous privilege mode
|
// value (before interrupt)
|
uint64_t MPP : 2; // [12:11]: the Machine previous privilege mode
|
uint64_t SPIE : 1; // [5]: Super-User level interrupts ena
|
|
// previous value (before interrupt)
|
|
uint64_t HPIE : 1; // [6]: Hypervisor level interrupts ena
|
|
// previous value (before interrupt)
|
|
uint64_t MPIE : 1; // [7]: Machine level interrupts ena previous
|
|
// value (before interrupt)
|
|
uint64_t SPP : 1; // [8]: One bit wide. Supper-user previously
|
|
// priviledged level
|
|
uint64_t HPP : 2; // [10:9]: the Hypervisor previous priv mode
|
|
uint64_t MPP : 2; // [12:11]: the Machine previous priv mode
|
uint64_t FS : 2; // [14:13]: RW: FPU context status
|
uint64_t FS : 2; // [14:13]: RW: FPU context status
|
uint64_t XS : 2; // [16:15]: RW: extension context status
|
uint64_t XS : 2; // [16:15]: RW: extension context status
|
uint64_t MPRV : 1; // [17] Memory privilege bit
|
uint64_t MPRV : 1; // [17] Memory privilege bit
|
uint64_t PUM : 1; // [18]
|
uint64_t PUM : 1; // [18]
|
uint64_t MXR : 1; // [19]
|
uint64_t MXR : 1; // [19]
|
uint64_t rsrv1 : 4; // [23:20]
|
uint64_t rsrv1 : 4; // [23:20]
|
uint64_t VM : 5; // [28:24] Virtualization management field (WARL)
|
uint64_t VM : 5; // [28:24] Virtualization management field
|
uint64_t rsrv2 : 64-30;// [62:29]
|
uint64_t rsv2 : 64-30; // [62:29]
|
uint64_t SD : 1; // RO: [63] Bit summarizes FS/XS bits
|
uint64_t SD : 1; // RO: [63] Bit summarizes FS/XS bits
|
} bits;
|
} bits;
|
uint64_t value;
|
uint64_t value;
|
};
|
};
|
|
|
Line 285... |
Line 463... |
/** Machine interrupt pending */
|
/** Machine interrupt pending */
|
static const uint16_t CSR_mip = 0x344;
|
static const uint16_t CSR_mip = 0x344;
|
/// @}
|
/// @}
|
|
|
/** Exceptions */
|
/** Exceptions */
|
enum EExeption {
|
enum ESignals {
|
// Instruction address misaligned
|
// Instruction address misaligned
|
EXCEPTION_InstrMisalign = 0,
|
EXCEPTION_InstrMisalign,
|
// Instruction access fault
|
// Instruction access fault
|
EXCEPTION_InstrFault = 1,
|
EXCEPTION_InstrFault,
|
// Illegal instruction
|
// Illegal instruction
|
EXCEPTION_InstrIllegal = 2,
|
EXCEPTION_InstrIllegal,
|
// Breakpoint
|
// Breakpoint
|
EXCEPTION_Breakpoint = 3,
|
EXCEPTION_Breakpoint,
|
// Load address misaligned
|
// Load address misaligned
|
EXCEPTION_LoadMisalign = 4,
|
EXCEPTION_LoadMisalign,
|
// Load access fault
|
// Load access fault
|
EXCEPTION_LoadFault = 5,
|
EXCEPTION_LoadFault,
|
//Store/AMO address misaligned
|
//Store/AMO address misaligned
|
EXCEPTION_StoreMisalign = 6,
|
EXCEPTION_StoreMisalign,
|
// Store/AMO access fault
|
// Store/AMO access fault
|
EXCEPTION_StoreFault = 7,
|
EXCEPTION_StoreFault,
|
// Environment call from U-mode
|
// Environment call from U-mode
|
EXCEPTION_CallFromUmode = 8,
|
EXCEPTION_CallFromUmode,
|
// Environment call from S-mode
|
// Environment call from S-mode
|
EXCEPTION_CallFromSmode = 9,
|
EXCEPTION_CallFromSmode,
|
// Environment call from H-mode
|
// Environment call from H-mode
|
EXCEPTION_CallFromHmode = 10,
|
EXCEPTION_CallFromHmode,
|
// Environment call from M-mode
|
// Environment call from M-mode
|
EXCEPTION_CallFromMmode = 11
|
EXCEPTION_CallFromMmode,
|
};
|
|
|
|
enum EInterrupt {
|
|
// User software interrupt
|
// User software interrupt
|
INTERRUPT_USoftware = 0,
|
INTERRUPT_USoftware,
|
// Superuser software interrupt
|
// Superuser software interrupt
|
INTERRUPT_SSoftware = 1,
|
INTERRUPT_SSoftware,
|
// Hypervisor software itnerrupt
|
// Hypervisor software itnerrupt
|
INTERRUPT_HSoftware = 2,
|
INTERRUPT_HSoftware,
|
// Machine software interrupt
|
// Machine software interrupt
|
INTERRUPT_MSoftware = 3,
|
INTERRUPT_MSoftware,
|
// User timer interrupt
|
// User timer interrupt
|
INTERRUPT_UTimer = 4,
|
INTERRUPT_UTimer,
|
// Superuser timer interrupt
|
// Superuser timer interrupt
|
INTERRUPT_STimer = 5,
|
INTERRUPT_STimer,
|
// Hypervisor timer interrupt
|
// Hypervisor timer interrupt
|
INTERRUPT_HTimer = 6,
|
INTERRUPT_HTimer,
|
// Machine timer interrupt
|
// Machine timer interrupt
|
INTERRUPT_MTimer = 7,
|
INTERRUPT_MTimer,
|
// User external interrupt
|
// User external interrupt
|
INTERRUPT_UExternal = 8,
|
INTERRUPT_UExternal,
|
// Superuser external interrupt
|
// Superuser external interrupt
|
INTERRUPT_SExternal = 9,
|
INTERRUPT_SExternal,
|
// Hypervisor external interrupt
|
// Hypervisor external interrupt
|
INTERRUPT_HExternal = 10,
|
INTERRUPT_HExternal,
|
// Machine external interrupt (from PLIC)
|
// Machine external interrupt (from PLIC)
|
INTERRUPT_MExternal = 11,
|
INTERRUPT_MExternal,
|
|
|
|
SIGNAL_HardReset,
|
|
SIGNAL_Total
|
};
|
};
|
|
|
} // namespace debugger
|
} // namespace debugger
|
|
|
#endif // __DEBUGGER_RISCV_ISA_H__
|
#endif // __DEBUGGER_RISCV_ISA_H__
|