qemu-e2k/target/e2k/cpu.h

141 lines
3.5 KiB
C
Raw Normal View History

2020-10-15 16:08:01 +02:00
#ifndef E2K_CPU_H
#define E2K_CPU_H
#include "qemu/bswap.h"
#include "cpu-qom.h"
#include "exec/cpu-defs.h"
2020-11-08 19:27:47 +01:00
void e2k_tcg_initialize(void);
#define MMU_USER_IDX 1
#define CPU_RESOLVING_TYPE TYPE_E2K_CPU
2020-11-11 10:28:06 +01:00
#define WREGS_SIZE 192
2020-11-11 11:23:38 +01:00
// size of regular reg in bytes
#define REG_SIZE (sizeof(target_ulong))
2020-11-08 19:27:47 +01:00
#define CTPR_BASE_OFF 0
#define CTPR_BASE_END 47
#define CTPR_TAG_OFF 54
#define CTPR_TAG_END 56
#define CTPR_OPC_OFF 57
#define CTPR_OPC_END 58
#define CTPR_IPD_OFF 59
#define CTPR_IPD_END 60
#define LSR_LCNT_OFF 0 /* loop counter */
#define LSR_LCNT_END 31
#define LSR_LCNT_LEN (LSR_LCNT_END - LSR_LCNT_OFF + 1)
#define LSR_ECNT_OFF 32 /* epilogue counter */
#define LSR_ECNT_END 36
#define LSR_ECNT_LEN (LSR_ECNT_END - LSR_ECNT_OFF + 1)
#define LSR_VLC_OFF 37 /* loop count valid bit */
#define LSR_OVER_OFF 38 /* loop count overflow */
#define LSR_LDMC_OFF 39 /* loads manual control */
#define LSR_LDOVL_OFF 40 /* load overlap */
#define LSR_LDOVL_END 47
#define LSR_LDOVL_SIZE (LSR_LDOVL_END - LSR_LDOVL_OFF + 1)
#define LSR_PCNT_OFF 48 /* prologue counter */
#define LSR_PCNT_END 52
#define LSR_PCNT_LEN (LSR_PCNT_END - LSR_PCNT_OFF + 1)
#define LSR_STRMD_OFF 53 /* store remainder counter */
#define LSR_STRMD_END 59
#define LSR_STRMD_LEN (LSR_STRMD_END - LSR_STRMD_OFF + 1)
#define LSR_SEMC_OFF /* side effects manual control */
2020-11-12 14:52:51 +01:00
typedef enum {
E2K_EXCP_UNIMPL = 0x01,
E2K_EXCP_SYSCALL = 0x02,
2020-11-12 14:52:51 +01:00
} Exception;
2020-11-08 19:27:47 +01:00
struct e2k_def_t {
const char *name;
uint32_t isa_version;
};
typedef struct CPUArchState {
2020-10-15 16:08:01 +02:00
/* register file */
target_ulong gregs[32]; // global regs
target_ulong wregs[WREGS_SIZE]; // window regs
2020-11-11 10:28:06 +01:00
target_ulong *win_ptr;
2020-11-10 23:32:28 +01:00
uint64_t pregs;
2020-11-13 15:49:28 +01:00
2020-11-13 21:47:31 +01:00
uint32_t wbs; // window regs offset
uint32_t wsz; // window regs size
uint32_t nfx; // TODO
uint32_t dbl; // TODO
2020-11-13 15:49:28 +01:00
/* TODO: move them to %br? */
2020-11-13 21:47:31 +01:00
uint32_t rbs; // based regs offset
uint32_t rsz; // based regs size
uint32_t rcur; // based regs current offset
2020-11-13 15:49:28 +01:00
uint64_t psz; // pred regs window size
uint64_t pcur; // pred regs current offset
uint64_t lsr; /* loop status register */
uint32_t syscall_wbs;
2020-10-15 16:08:01 +02:00
2020-11-12 22:46:57 +01:00
uint64_t usd_lo;
uint64_t usd_hi;
2020-10-15 16:08:01 +02:00
/* control registers */
2020-11-10 23:32:28 +01:00
target_ulong ctprs[3]; // Control Transfer Preparation Register (CTPR)
2020-10-15 16:08:01 +02:00
/* special registers */
2020-11-10 23:32:28 +01:00
target_ulong ip; /* instruction address, next instruction address */
2020-10-15 16:08:01 +02:00
uint32_t pfpfr; // Packed Floating Point Flag Register (PFPFR)
uint32_t fpcr; // Floating point control register (FPCR)
uint32_t fpsr; // Floating point state register (FPSR)
2020-11-08 19:27:47 +01:00
int interrupt_index;
/* Fields up to this point are cleared by a CPU reset */
struct {} end_reset_fields;
uint32_t version;
struct e2k_def_t def;
} CPUE2KState;
2020-10-15 16:08:01 +02:00
/**
* E2KCPU:
* @env: #CPUE2KState
*
* An Elbrus CPU.
*/
struct ArchCPU {
2020-10-15 16:08:01 +02:00
/*< private >*/
CPUState parent_obj;
/*< public >*/
CPUNegativeOffsetState neg;
CPUE2KState env;
};
2020-11-08 19:27:47 +01:00
static inline void cpu_get_tb_cpu_state(CPUE2KState *env, target_ulong *pc,
target_ulong *cs_base, uint32_t *pflags)
{
*pc = env->ip;
2020-11-10 23:32:28 +01:00
*cs_base = 0;
2020-11-08 19:27:47 +01:00
*pflags = MMU_USER_IDX;
}
static inline int cpu_mmu_index(CPUE2KState *env, bool ifetch)
{
#ifdef CONFIG_USER_ONLY
return MMU_USER_IDX;
#else
#error softmmu is not supported on E2K
#endif
}
int e2k_cpu_signal_handler(int host_signum, void *pinfo, void *puc);
#define cpu_signal_handler e2k_cpu_signal_handler
#include "exec/cpu-all.h"
2020-10-15 16:08:01 +02:00
#endif