Annotation of qemu/target-lm32/cpu.h, revision 1.1

1.1     ! root        1: /*
        !             2:  *  LatticeMico32 virtual CPU header.
        !             3:  *
        !             4:  *  Copyright (c) 2010 Michael Walle <[email protected]>
        !             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 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 <http://www.gnu.org/licenses/>.
        !            18:  */
        !            19: 
        !            20: #ifndef CPU_LM32_H
        !            21: #define CPU_LM32_H
        !            22: 
        !            23: #define TARGET_LONG_BITS 32
        !            24: 
        !            25: #define CPUState struct CPULM32State
        !            26: 
        !            27: #include "qemu-common.h"
        !            28: #include "cpu-defs.h"
        !            29: struct CPULM32State;
        !            30: 
        !            31: #define TARGET_HAS_ICE 1
        !            32: 
        !            33: #define ELF_MACHINE EM_LATTICEMICO32
        !            34: 
        !            35: #define NB_MMU_MODES 1
        !            36: #define TARGET_PAGE_BITS 12
        !            37: static inline int cpu_mmu_index(CPUState *env)
        !            38: {
        !            39:     return 0;
        !            40: }
        !            41: 
        !            42: #define TARGET_PHYS_ADDR_SPACE_BITS 32
        !            43: #define TARGET_VIRT_ADDR_SPACE_BITS 32
        !            44: 
        !            45: /* Exceptions indices */
        !            46: enum {
        !            47:     EXCP_RESET = 0,
        !            48:     EXCP_BREAKPOINT,
        !            49:     EXCP_INSN_BUS_ERROR,
        !            50:     EXCP_WATCHPOINT,
        !            51:     EXCP_DATA_BUS_ERROR,
        !            52:     EXCP_DIVIDE_BY_ZERO,
        !            53:     EXCP_IRQ,
        !            54:     EXCP_SYSTEMCALL
        !            55: };
        !            56: 
        !            57: /* Registers */
        !            58: enum {
        !            59:     R_R0 = 0, R_R1, R_R2, R_R3, R_R4, R_R5, R_R6, R_R7, R_R8, R_R9, R_R10,
        !            60:     R_R11, R_R12, R_R13, R_R14, R_R15, R_R16, R_R17, R_R18, R_R19, R_R20,
        !            61:     R_R21, R_R22, R_R23, R_R24, R_R25, R_R26, R_R27, R_R28, R_R29, R_R30,
        !            62:     R_R31
        !            63: };
        !            64: 
        !            65: /* Register aliases */
        !            66: enum {
        !            67:     R_GP = R_R26,
        !            68:     R_FP = R_R27,
        !            69:     R_SP = R_R28,
        !            70:     R_RA = R_R29,
        !            71:     R_EA = R_R30,
        !            72:     R_BA = R_R31
        !            73: };
        !            74: 
        !            75: /* IE flags */
        !            76: enum {
        !            77:     IE_IE  = (1<<0),
        !            78:     IE_EIE = (1<<1),
        !            79:     IE_BIE = (1<<2),
        !            80: };
        !            81: 
        !            82: /* DC flags */
        !            83: enum {
        !            84:     DC_SS  = (1<<0),
        !            85:     DC_RE  = (1<<1),
        !            86:     DC_C0  = (1<<2),
        !            87:     DC_C1  = (1<<3),
        !            88:     DC_C2  = (1<<4),
        !            89:     DC_C3  = (1<<5),
        !            90: };
        !            91: 
        !            92: /* CFG mask */
        !            93: enum {
        !            94:     CFG_M         = (1<<0),
        !            95:     CFG_D         = (1<<1),
        !            96:     CFG_S         = (1<<2),
        !            97:     CFG_U         = (1<<3),
        !            98:     CFG_X         = (1<<4),
        !            99:     CFG_CC        = (1<<5),
        !           100:     CFG_IC        = (1<<6),
        !           101:     CFG_DC        = (1<<7),
        !           102:     CFG_G         = (1<<8),
        !           103:     CFG_H         = (1<<9),
        !           104:     CFG_R         = (1<<10),
        !           105:     CFG_J         = (1<<11),
        !           106:     CFG_INT_SHIFT = 12,
        !           107:     CFG_BP_SHIFT  = 18,
        !           108:     CFG_WP_SHIFT  = 22,
        !           109:     CFG_REV_SHIFT = 26,
        !           110: };
        !           111: 
        !           112: /* CSRs */
        !           113: enum {
        !           114:     CSR_IE   = 0x00,
        !           115:     CSR_IM   = 0x01,
        !           116:     CSR_IP   = 0x02,
        !           117:     CSR_ICC  = 0x03,
        !           118:     CSR_DCC  = 0x04,
        !           119:     CSR_CC   = 0x05,
        !           120:     CSR_CFG  = 0x06,
        !           121:     CSR_EBA  = 0x07,
        !           122:     CSR_DC   = 0x08,
        !           123:     CSR_DEBA = 0x09,
        !           124:     CSR_JTX  = 0x0e,
        !           125:     CSR_JRX  = 0x0f,
        !           126:     CSR_BP0  = 0x10,
        !           127:     CSR_BP1  = 0x11,
        !           128:     CSR_BP2  = 0x12,
        !           129:     CSR_BP3  = 0x13,
        !           130:     CSR_WP0  = 0x18,
        !           131:     CSR_WP1  = 0x19,
        !           132:     CSR_WP2  = 0x1a,
        !           133:     CSR_WP3  = 0x1b,
        !           134: };
        !           135: 
        !           136: enum {
        !           137:     LM32_FEATURE_MULTIPLY     =  1,
        !           138:     LM32_FEATURE_DIVIDE       =  2,
        !           139:     LM32_FEATURE_SHIFT        =  4,
        !           140:     LM32_FEATURE_SIGN_EXTEND  =  8,
        !           141:     LM32_FEATURE_I_CACHE      = 16,
        !           142:     LM32_FEATURE_D_CACHE      = 32,
        !           143:     LM32_FEATURE_CYCLE_COUNT  = 64,
        !           144: };
        !           145: 
        !           146: enum {
        !           147:     LM32_FLAG_IGNORE_MSB = 1,
        !           148: };
        !           149: 
        !           150: typedef struct CPULM32State {
        !           151:     /* general registers */
        !           152:     uint32_t regs[32];
        !           153: 
        !           154:     /* special registers */
        !           155:     uint32_t pc;        /* program counter */
        !           156:     uint32_t ie;        /* interrupt enable */
        !           157:     uint32_t icc;       /* instruction cache control */
        !           158:     uint32_t dcc;       /* data cache control */
        !           159:     uint32_t cc;        /* cycle counter */
        !           160:     uint32_t cfg;       /* configuration */
        !           161: 
        !           162:     /* debug registers */
        !           163:     uint32_t dc;        /* debug control */
        !           164:     uint32_t bp[4];     /* breakpoint addresses */
        !           165:     uint32_t wp[4];     /* watchpoint addresses */
        !           166: 
        !           167:     CPU_COMMON
        !           168: 
        !           169:     uint32_t eba;       /* exception base address */
        !           170:     uint32_t deba;      /* debug exception base address */
        !           171: 
        !           172:     /* interrupt controller handle for callbacks */
        !           173:     DeviceState *pic_state;
        !           174:     /* JTAG UART handle for callbacks */
        !           175:     DeviceState *juart_state;
        !           176: 
        !           177:     /* processor core features */
        !           178:     uint32_t features;
        !           179:     uint32_t flags;
        !           180:     uint8_t num_bps;
        !           181:     uint8_t num_wps;
        !           182: 
        !           183: } CPULM32State;
        !           184: 
        !           185: 
        !           186: CPUState *cpu_lm32_init(const char *cpu_model);
        !           187: void cpu_lm32_list(FILE *f, fprintf_function cpu_fprintf);
        !           188: int cpu_lm32_exec(CPUState *s);
        !           189: void cpu_lm32_close(CPUState *s);
        !           190: void do_interrupt(CPUState *env);
        !           191: /* you can call this signal handler from your SIGBUS and SIGSEGV
        !           192:    signal handlers to inform the virtual CPU of exceptions. non zero
        !           193:    is returned if the signal was handled by the virtual CPU.  */
        !           194: int cpu_lm32_signal_handler(int host_signum, void *pinfo,
        !           195:                           void *puc);
        !           196: void lm32_translate_init(void);
        !           197: void cpu_lm32_set_phys_msb_ignore(CPUState *env, int value);
        !           198: 
        !           199: #define cpu_list cpu_lm32_list
        !           200: #define cpu_init cpu_lm32_init
        !           201: #define cpu_exec cpu_lm32_exec
        !           202: #define cpu_gen_code cpu_lm32_gen_code
        !           203: #define cpu_signal_handler cpu_lm32_signal_handler
        !           204: 
        !           205: #define CPU_SAVE_VERSION 1
        !           206: 
        !           207: int cpu_lm32_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
        !           208:                             int mmu_idx, int is_softmmu);
        !           209: #define cpu_handle_mmu_fault cpu_lm32_handle_mmu_fault
        !           210: 
        !           211: #if defined(CONFIG_USER_ONLY)
        !           212: static inline void cpu_clone_regs(CPUState *env, target_ulong newsp)
        !           213: {
        !           214:     if (newsp) {
        !           215:         env->regs[R_SP] = newsp;
        !           216:     }
        !           217:     env->regs[R_R1] = 0;
        !           218: }
        !           219: #endif
        !           220: 
        !           221: static inline void cpu_set_tls(CPUState *env, target_ulong newtls)
        !           222: {
        !           223: }
        !           224: 
        !           225: static inline int cpu_interrupts_enabled(CPUState *env)
        !           226: {
        !           227:     return env->ie & IE_IE;
        !           228: }
        !           229: 
        !           230: #include "cpu-all.h"
        !           231: 
        !           232: static inline target_ulong cpu_get_pc(CPUState *env)
        !           233: {
        !           234:     return env->pc;
        !           235: }
        !           236: 
        !           237: static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc,
        !           238:                                         target_ulong *cs_base, int *flags)
        !           239: {
        !           240:     *pc = env->pc;
        !           241:     *cs_base = 0;
        !           242:     *flags = 0;
        !           243: }
        !           244: 
        !           245: static inline bool cpu_has_work(CPUState *env)
        !           246: {
        !           247:     return env->interrupt_request & CPU_INTERRUPT_HARD;
        !           248: }
        !           249: 
        !           250: #include "exec-all.h"
        !           251: 
        !           252: static inline void cpu_pc_from_tb(CPUState *env, TranslationBlock *tb)
        !           253: {
        !           254:     env->pc = tb->pc;
        !           255: }
        !           256: 
        !           257: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.