Statistics
| Branch: | Revision:

root / target-arm / cpu.h @ 157777ef

History | View | Annotate | Download (3.4 kB)

1 2c0262af bellard
/*
2 2c0262af bellard
 * ARM virtual CPU header
3 2c0262af bellard
 * 
4 2c0262af bellard
 *  Copyright (c) 2003 Fabrice Bellard
5 2c0262af bellard
 *
6 2c0262af bellard
 * This library is free software; you can redistribute it and/or
7 2c0262af bellard
 * modify it under the terms of the GNU Lesser General Public
8 2c0262af bellard
 * License as published by the Free Software Foundation; either
9 2c0262af bellard
 * version 2 of the License, or (at your option) any later version.
10 2c0262af bellard
 *
11 2c0262af bellard
 * This library is distributed in the hope that it will be useful,
12 2c0262af bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 2c0262af bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 2c0262af bellard
 * Lesser General Public License for more details.
15 2c0262af bellard
 *
16 2c0262af bellard
 * You should have received a copy of the GNU Lesser General Public
17 2c0262af bellard
 * License along with this library; if not, write to the Free Software
18 2c0262af bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 2c0262af bellard
 */
20 2c0262af bellard
#ifndef CPU_ARM_H
21 2c0262af bellard
#define CPU_ARM_H
22 2c0262af bellard
23 3cf1e035 bellard
#define TARGET_LONG_BITS 32
24 3cf1e035 bellard
25 2c0262af bellard
#include "cpu-defs.h"
26 2c0262af bellard
27 b8a9e8f1 bellard
#define EXCP_UDEF            1   /* undefined instruction */
28 b8a9e8f1 bellard
#define EXCP_SWI             2   /* software interrupt */
29 b8a9e8f1 bellard
#define EXCP_PREFETCH_ABORT  3
30 b8a9e8f1 bellard
#define EXCP_DATA_ABORT      4
31 2c0262af bellard
32 b7bcbe95 bellard
/* We currently assume float and double are IEEE single and double
33 b7bcbe95 bellard
   precision respectively.
34 b7bcbe95 bellard
   Doing runtime conversions is tricky because VFP registers may contain
35 b7bcbe95 bellard
   integer values (eg. as the result of a FTOSI instruction).
36 b7bcbe95 bellard
   A double precision register load/store must also load/store the
37 b7bcbe95 bellard
   corresponding single precision pair, although it is undefined how
38 b7bcbe95 bellard
   these overlap.  */
39 b7bcbe95 bellard
40 2c0262af bellard
typedef struct CPUARMState {
41 2c0262af bellard
    uint32_t regs[16];
42 2c0262af bellard
    uint32_t cpsr;
43 2c0262af bellard
    
44 2c0262af bellard
    /* cpsr flag cache for faster execution */
45 2c0262af bellard
    uint32_t CF; /* 0 or 1 */
46 2c0262af bellard
    uint32_t VF; /* V is the bit 31. All other bits are undefined */
47 2c0262af bellard
    uint32_t NZF; /* N is bit 31. Z is computed from NZF */
48 99c475ab bellard
    uint32_t QF; /* 0 or 1 */
49 99c475ab bellard
50 99c475ab bellard
    int thumb; /* 0 = arm mode, 1 = thumb mode */
51 2c0262af bellard
52 b8a9e8f1 bellard
    /* coprocessor 15 (MMU) status */
53 b8a9e8f1 bellard
    uint32_t cp15_6;
54 b8a9e8f1 bellard
    
55 2c0262af bellard
    /* exception/interrupt handling */
56 2c0262af bellard
    jmp_buf jmp_env;
57 2c0262af bellard
    int exception_index;
58 2c0262af bellard
    int interrupt_request;
59 2c0262af bellard
    struct TranslationBlock *current_tb;
60 2c0262af bellard
    int user_mode_only;
61 b7bcbe95 bellard
    uint32_t address;
62 2c0262af bellard
63 d720b93d bellard
    /* in order to avoid passing too many arguments to the memory
64 d720b93d bellard
       write helpers, we store some rarely used information in the CPU
65 d720b93d bellard
       context) */
66 d720b93d bellard
    unsigned long mem_write_pc; /* host pc at which the memory was
67 d720b93d bellard
                                   written */
68 d720b93d bellard
    unsigned long mem_write_vaddr; /* target virtual addr at which the
69 d720b93d bellard
                                      memory was written */
70 b7bcbe95 bellard
    /* VFP coprocessor state.  */
71 b7bcbe95 bellard
    struct {
72 b7bcbe95 bellard
        union {
73 b7bcbe95 bellard
            float s[32];
74 b7bcbe95 bellard
            double d[16];
75 b7bcbe95 bellard
        } regs;
76 b7bcbe95 bellard
77 b7bcbe95 bellard
        /* We store these fpcsr fields separately for convenience.  */
78 b7bcbe95 bellard
        int vec_len;
79 b7bcbe95 bellard
        int vec_stride;
80 b7bcbe95 bellard
81 b7bcbe95 bellard
        uint32_t fpscr;
82 b7bcbe95 bellard
83 b7bcbe95 bellard
        /* Temporary variables if we don't have spare fp regs.  */
84 b7bcbe95 bellard
        float tmp0s, tmp1s;
85 b7bcbe95 bellard
        double tmp0d, tmp1d;
86 b7bcbe95 bellard
87 b7bcbe95 bellard
    } vfp;
88 b7bcbe95 bellard
89 2c0262af bellard
    /* user data */
90 2c0262af bellard
    void *opaque;
91 2c0262af bellard
} CPUARMState;
92 2c0262af bellard
93 2c0262af bellard
CPUARMState *cpu_arm_init(void);
94 2c0262af bellard
int cpu_arm_exec(CPUARMState *s);
95 2c0262af bellard
void cpu_arm_close(CPUARMState *s);
96 2c0262af bellard
/* you can call this signal handler from your SIGBUS and SIGSEGV
97 2c0262af bellard
   signal handlers to inform the virtual CPU of exceptions. non zero
98 2c0262af bellard
   is returned if the signal was handled by the virtual CPU.  */
99 2c0262af bellard
struct siginfo;
100 2c0262af bellard
int cpu_arm_signal_handler(int host_signum, struct siginfo *info, 
101 2c0262af bellard
                           void *puc);
102 2c0262af bellard
103 2c0262af bellard
#define TARGET_PAGE_BITS 12
104 2c0262af bellard
#include "cpu-all.h"
105 2c0262af bellard
106 2c0262af bellard
#endif