qemu/target/nios2/cpu.h
<<
>>
Prefs
   1/*
   2 * Altera Nios II virtual CPU header
   3 *
   4 * Copyright (c) 2012 Chris Wulff <crwulff@gmail.com>
   5 *
   6 * This library is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU Lesser General Public
   8 * License as published by the Free Software Foundation; either
   9 * version 2.1 of the License, or (at your option) any later version.
  10 *
  11 * This library is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14 * Lesser General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU Lesser General Public
  17 * License along with this library; if not, see
  18 * <http://www.gnu.org/licenses/lgpl-2.1.html>
  19 */
  20
  21#ifndef NIOS2_CPU_H
  22#define NIOS2_CPU_H
  23
  24#include "exec/cpu-defs.h"
  25#include "hw/core/cpu.h"
  26#include "hw/registerfields.h"
  27#include "qom/object.h"
  28
  29typedef struct CPUArchState CPUNios2State;
  30#if !defined(CONFIG_USER_ONLY)
  31#include "mmu.h"
  32#endif
  33
  34#define TYPE_NIOS2_CPU "nios2-cpu"
  35
  36OBJECT_DECLARE_CPU_TYPE(Nios2CPU, Nios2CPUClass, NIOS2_CPU)
  37
  38/**
  39 * Nios2CPUClass:
  40 * @parent_reset: The parent class' reset handler.
  41 *
  42 * A Nios2 CPU model.
  43 */
  44struct Nios2CPUClass {
  45    /*< private >*/
  46    CPUClass parent_class;
  47    /*< public >*/
  48
  49    DeviceRealize parent_realize;
  50    DeviceReset parent_reset;
  51};
  52
  53#define TARGET_HAS_ICE 1
  54
  55/* Configuration options for Nios II */
  56#define RESET_ADDRESS         0x00000000
  57#define EXCEPTION_ADDRESS     0x00000004
  58#define FAST_TLB_MISS_ADDRESS 0x00000008
  59
  60#define NUM_GP_REGS 32
  61#define NUM_CR_REGS 32
  62
  63#ifndef CONFIG_USER_ONLY
  64/* 63 shadow register sets; index 0 is the primary register set. */
  65#define NUM_REG_SETS 64
  66#endif
  67
  68/* General purpose register aliases */
  69enum {
  70    R_ZERO   = 0,
  71    R_AT     = 1,
  72    R_RET0   = 2,
  73    R_RET1   = 3,
  74    R_ARG0   = 4,
  75    R_ARG1   = 5,
  76    R_ARG2   = 6,
  77    R_ARG3   = 7,
  78    R_ET     = 24,
  79    R_BT     = 25,
  80    R_GP     = 26,
  81    R_SP     = 27,
  82    R_FP     = 28,
  83    R_EA     = 29,
  84    R_BA     = 30,
  85    R_SSTATUS = 30,
  86    R_RA     = 31,
  87};
  88
  89/* Control register aliases */
  90enum {
  91    CR_STATUS        = 0,
  92    CR_ESTATUS       = 1,
  93    CR_BSTATUS       = 2,
  94    CR_IENABLE       = 3,
  95    CR_IPENDING      = 4,
  96    CR_CPUID         = 5,
  97    CR_EXCEPTION     = 7,
  98    CR_PTEADDR       = 8,
  99    CR_TLBACC        = 9,
 100    CR_TLBMISC       = 10,
 101    CR_ENCINJ        = 11,
 102    CR_BADADDR       = 12,
 103    CR_CONFIG        = 13,
 104    CR_MPUBASE       = 14,
 105    CR_MPUACC        = 15,
 106};
 107
 108FIELD(CR_STATUS, PIE, 0, 1)
 109FIELD(CR_STATUS, U, 1, 1)
 110FIELD(CR_STATUS, EH, 2, 1)
 111FIELD(CR_STATUS, IH, 3, 1)
 112FIELD(CR_STATUS, IL, 4, 6)
 113FIELD(CR_STATUS, CRS, 10, 6)
 114FIELD(CR_STATUS, PRS, 16, 6)
 115FIELD(CR_STATUS, NMI, 22, 1)
 116FIELD(CR_STATUS, RSIE, 23, 1)
 117FIELD(CR_STATUS, SRS, 31, 1)  /* only in sstatus */
 118
 119#define CR_STATUS_PIE    R_CR_STATUS_PIE_MASK
 120#define CR_STATUS_U      R_CR_STATUS_U_MASK
 121#define CR_STATUS_EH     R_CR_STATUS_EH_MASK
 122#define CR_STATUS_IH     R_CR_STATUS_IH_MASK
 123#define CR_STATUS_NMI    R_CR_STATUS_NMI_MASK
 124#define CR_STATUS_RSIE   R_CR_STATUS_RSIE_MASK
 125#define CR_STATUS_SRS    R_CR_STATUS_SRS_MASK
 126
 127FIELD(CR_EXCEPTION, CAUSE, 2, 5)
 128FIELD(CR_EXCEPTION, ECCFTL, 31, 1)
 129
 130FIELD(CR_PTEADDR, VPN, 2, 20)
 131FIELD(CR_PTEADDR, PTBASE, 22, 10)
 132
 133FIELD(CR_TLBACC, PFN, 0, 20)
 134FIELD(CR_TLBACC, G, 20, 1)
 135FIELD(CR_TLBACC, X, 21, 1)
 136FIELD(CR_TLBACC, W, 22, 1)
 137FIELD(CR_TLBACC, R, 23, 1)
 138FIELD(CR_TLBACC, C, 24, 1)
 139FIELD(CR_TLBACC, IG, 25, 7)
 140
 141#define CR_TLBACC_C      R_CR_TLBACC_C_MASK
 142#define CR_TLBACC_R      R_CR_TLBACC_R_MASK
 143#define CR_TLBACC_W      R_CR_TLBACC_W_MASK
 144#define CR_TLBACC_X      R_CR_TLBACC_X_MASK
 145#define CR_TLBACC_G      R_CR_TLBACC_G_MASK
 146
 147FIELD(CR_TLBMISC, D, 0, 1)
 148FIELD(CR_TLBMISC, PERM, 1, 1)
 149FIELD(CR_TLBMISC, BAD, 2, 1)
 150FIELD(CR_TLBMISC, DBL, 3, 1)
 151FIELD(CR_TLBMISC, PID, 4, 14)
 152FIELD(CR_TLBMISC, WE, 18, 1)
 153FIELD(CR_TLBMISC, RD, 19, 1)
 154FIELD(CR_TLBMISC, WAY, 20, 4)
 155FIELD(CR_TLBMISC, EE, 24, 1)
 156
 157#define CR_TLBMISC_EE    R_CR_TLBMISC_EE_MASK
 158#define CR_TLBMISC_RD    R_CR_TLBMISC_RD_MASK
 159#define CR_TLBMISC_WE    R_CR_TLBMISC_WE_MASK
 160#define CR_TLBMISC_DBL   R_CR_TLBMISC_DBL_MASK
 161#define CR_TLBMISC_BAD   R_CR_TLBMISC_BAD_MASK
 162#define CR_TLBMISC_PERM  R_CR_TLBMISC_PERM_MASK
 163#define CR_TLBMISC_D     R_CR_TLBMISC_D_MASK
 164
 165/* Exceptions */
 166#define EXCP_BREAK    0x1000
 167#define EXCP_SEMIHOST 0x1001
 168#define EXCP_RESET    0
 169#define EXCP_PRESET   1
 170#define EXCP_IRQ      2
 171#define EXCP_TRAP     3
 172#define EXCP_UNIMPL   4
 173#define EXCP_ILLEGAL  5
 174#define EXCP_UNALIGN  6
 175#define EXCP_UNALIGND 7
 176#define EXCP_DIV      8
 177#define EXCP_SUPERA_X 9
 178#define EXCP_SUPERI   10
 179#define EXCP_SUPERA_D 11
 180#define EXCP_TLB_X    12
 181#define EXCP_TLB_D    (0x1000 | EXCP_TLB_X)
 182#define EXCP_PERM_X   13
 183#define EXCP_PERM_R   14
 184#define EXCP_PERM_W   15
 185#define EXCP_MPUI     16
 186#define EXCP_MPUD     17
 187
 188struct CPUArchState {
 189#ifdef CONFIG_USER_ONLY
 190    uint32_t regs[NUM_GP_REGS];
 191#else
 192    uint32_t shadow_regs[NUM_REG_SETS][NUM_GP_REGS];
 193    /* Pointer into shadow_regs for the current register set. */
 194    uint32_t *regs;
 195#endif
 196    uint32_t ctrl[NUM_CR_REGS];
 197    uint32_t pc;
 198
 199#if !defined(CONFIG_USER_ONLY)
 200    Nios2MMU mmu;
 201#endif
 202    int error_code;
 203};
 204
 205typedef struct {
 206    uint32_t writable;
 207    uint32_t readonly;
 208} ControlRegState;
 209
 210/**
 211 * Nios2CPU:
 212 * @env: #CPUNios2State
 213 *
 214 * A Nios2 CPU.
 215 */
 216struct ArchCPU {
 217    /*< private >*/
 218    CPUState parent_obj;
 219    /*< public >*/
 220
 221    CPUNegativeOffsetState neg;
 222    CPUNios2State env;
 223
 224    bool diverr_present;
 225    bool mmu_present;
 226    bool eic_present;
 227
 228    uint32_t pid_num_bits;
 229    uint32_t tlb_num_ways;
 230    uint32_t tlb_num_entries;
 231
 232    /* Addresses that are hard-coded in the FPGA build settings */
 233    uint32_t reset_addr;
 234    uint32_t exception_addr;
 235    uint32_t fast_tlb_miss_addr;
 236
 237    /* Bits within each control register which are reserved or readonly. */
 238    ControlRegState cr_state[NUM_CR_REGS];
 239
 240    /* External Interrupt Controller Interface */
 241    uint32_t rha; /* Requested handler address */
 242    uint32_t ril; /* Requested interrupt level */
 243    uint32_t rrs; /* Requested register set */
 244    bool rnmi;    /* Requested nonmaskable interrupt */
 245};
 246
 247
 248static inline bool nios2_cr_reserved(const ControlRegState *s)
 249{
 250    return (s->writable | s->readonly) == 0;
 251}
 252
 253static inline void nios2_update_crs(CPUNios2State *env)
 254{
 255#ifndef CONFIG_USER_ONLY
 256    unsigned crs = FIELD_EX32(env->ctrl[CR_STATUS], CR_STATUS, CRS);
 257    env->regs = env->shadow_regs[crs];
 258#endif
 259}
 260
 261void nios2_tcg_init(void);
 262void nios2_cpu_do_interrupt(CPUState *cs);
 263void dump_mmu(CPUNios2State *env);
 264void nios2_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
 265hwaddr nios2_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
 266G_NORETURN void nios2_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
 267                                              MMUAccessType access_type, int mmu_idx,
 268                                              uintptr_t retaddr);
 269G_NORETURN void nios2_cpu_loop_exit_advance(CPUNios2State *env,
 270                                            uintptr_t retaddr);
 271
 272void do_nios2_semihosting(CPUNios2State *env);
 273
 274#define CPU_RESOLVING_TYPE TYPE_NIOS2_CPU
 275
 276#define cpu_gen_code cpu_nios2_gen_code
 277
 278#define CPU_SAVE_VERSION 1
 279
 280/* MMU modes definitions */
 281#define MMU_SUPERVISOR_IDX  0
 282#define MMU_USER_IDX        1
 283
 284static inline int cpu_mmu_index(CPUNios2State *env, bool ifetch)
 285{
 286    return (env->ctrl[CR_STATUS] & CR_STATUS_U) ? MMU_USER_IDX :
 287                                                  MMU_SUPERVISOR_IDX;
 288}
 289
 290#ifndef CONFIG_USER_ONLY
 291bool nios2_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
 292                        MMUAccessType access_type, int mmu_idx,
 293                        bool probe, uintptr_t retaddr);
 294#endif
 295
 296typedef CPUNios2State CPUArchState;
 297typedef Nios2CPU ArchCPU;
 298
 299#include "exec/cpu-all.h"
 300
 301FIELD(TBFLAGS, CRS0, 0, 1)  /* Set if CRS == 0. */
 302FIELD(TBFLAGS, U, 1, 1)     /* Overlaps CR_STATUS_U */
 303FIELD(TBFLAGS, R0_0, 2, 1)  /* Set if R0 == 0. */
 304
 305static inline void cpu_get_tb_cpu_state(CPUNios2State *env, target_ulong *pc,
 306                                        target_ulong *cs_base, uint32_t *flags)
 307{
 308    unsigned crs = FIELD_EX32(env->ctrl[CR_STATUS], CR_STATUS, CRS);
 309
 310    *pc = env->pc;
 311    *cs_base = 0;
 312    *flags = (env->ctrl[CR_STATUS] & CR_STATUS_U)
 313           | (crs ? 0 : R_TBFLAGS_CRS0_MASK)
 314           | (env->regs[0] ? 0 : R_TBFLAGS_R0_0_MASK);
 315}
 316
 317#endif /* NIOS2_CPU_H */
 318