X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=cpu-all.h;h=c7491a00cf70d7f6d48799e29bc299a9cdfff285;hb=3ab493de4c524926bb75b04765b644f9189ccf01;hp=e8cb0756defb74ddc07545f2a4394cb6e7ebb381;hpb=5a9fdfec7eff4f053705cf160be87ebf01a57833;p=qemu diff --git a/cpu-all.h b/cpu-all.h index e8cb075..c7491a0 100644 --- a/cpu-all.h +++ b/cpu-all.h @@ -20,18 +20,19 @@ #ifndef CPU_ALL_H #define CPU_ALL_H -/* all CPU memory access use these macros */ -static inline int ldub(void *ptr) +/* CPU memory access without any memory or io remapping */ + +static inline int ldub_raw(void *ptr) { return *(uint8_t *)ptr; } -static inline int ldsb(void *ptr) +static inline int ldsb_raw(void *ptr) { return *(int8_t *)ptr; } -static inline void stb(void *ptr, int v) +static inline void stb_raw(void *ptr, int v) { *(uint8_t *)ptr = v; } @@ -42,7 +43,7 @@ static inline void stb(void *ptr, int v) #if defined(WORDS_BIGENDIAN) || defined(__arm__) /* conservative code for little endian unaligned accesses */ -static inline int lduw(void *ptr) +static inline int lduw_raw(void *ptr) { #ifdef __powerpc__ int val; @@ -54,7 +55,7 @@ static inline int lduw(void *ptr) #endif } -static inline int ldsw(void *ptr) +static inline int ldsw_raw(void *ptr) { #ifdef __powerpc__ int val; @@ -66,7 +67,7 @@ static inline int ldsw(void *ptr) #endif } -static inline int ldl(void *ptr) +static inline int ldl_raw(void *ptr) { #ifdef __powerpc__ int val; @@ -78,16 +79,16 @@ static inline int ldl(void *ptr) #endif } -static inline uint64_t ldq(void *ptr) +static inline uint64_t ldq_raw(void *ptr) { uint8_t *p = ptr; uint32_t v1, v2; - v1 = ldl(p); - v2 = ldl(p + 4); + v1 = ldl_raw(p); + v2 = ldl_raw(p + 4); return v1 | ((uint64_t)v2 << 32); } -static inline void stw(void *ptr, int v) +static inline void stw_raw(void *ptr, int v) { #ifdef __powerpc__ __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*(uint16_t *)ptr) : "r" (v), "r" (ptr)); @@ -98,7 +99,7 @@ static inline void stw(void *ptr, int v) #endif } -static inline void stl(void *ptr, int v) +static inline void stl_raw(void *ptr, int v) { #ifdef __powerpc__ __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr)); @@ -111,142 +112,231 @@ static inline void stl(void *ptr, int v) #endif } -static inline void stq(void *ptr, uint64_t v) +static inline void stq_raw(void *ptr, uint64_t v) { uint8_t *p = ptr; - stl(p, (uint32_t)v); - stl(p + 4, v >> 32); + stl_raw(p, (uint32_t)v); + stl_raw(p + 4, v >> 32); } /* float access */ -static inline float ldfl(void *ptr) +static inline float ldfl_raw(void *ptr) { union { float f; uint32_t i; } u; - u.i = ldl(ptr); + u.i = ldl_raw(ptr); return u.f; } -static inline void stfl(void *ptr, float v) +static inline void stfl_raw(void *ptr, float v) { union { float f; uint32_t i; } u; u.f = v; - stl(ptr, u.i); + stl_raw(ptr, u.i); } + #if defined(__arm__) && !defined(WORDS_BIGENDIAN) /* NOTE: arm is horrible as double 32 bit words are stored in big endian ! */ -static inline double ldfq(void *ptr) +static inline double ldfq_raw(void *ptr) { union { double d; uint32_t tab[2]; } u; - u.tab[1] = ldl(ptr); - u.tab[0] = ldl(ptr + 4); + u.tab[1] = ldl_raw(ptr); + u.tab[0] = ldl_raw(ptr + 4); return u.d; } -static inline void stfq(void *ptr, double v) +static inline void stfq_raw(void *ptr, double v) { union { double d; uint32_t tab[2]; } u; u.d = v; - stl(ptr, u.tab[1]); - stl(ptr + 4, u.tab[0]); + stl_raw(ptr, u.tab[1]); + stl_raw(ptr + 4, u.tab[0]); } #else -static inline double ldfq(void *ptr) +static inline double ldfq_raw(void *ptr) { union { double d; uint64_t i; } u; - u.i = ldq(ptr); + u.i = ldq_raw(ptr); return u.d; } -static inline void stfq(void *ptr, double v) +static inline void stfq_raw(void *ptr, double v) { union { double d; uint64_t i; } u; u.d = v; - stq(ptr, u.i); + stq_raw(ptr, u.i); } #endif +#elif defined(TARGET_WORDS_BIGENDIAN) && !defined(WORDS_BIGENDIAN) + +static inline int lduw_raw(void *ptr) +{ + uint8_t *b = (uint8_t *) ptr; + return (b[0]<<8|b[1]); +} + +static inline int ldsw_raw(void *ptr) +{ + int8_t *b = (int8_t *) ptr; + return (b[0]<<8|b[1]); +} + +static inline int ldl_raw(void *ptr) +{ + uint8_t *b = (uint8_t *) ptr; + return (b[0]<<24|b[1]<<16|b[2]<<8|b[3]); +} + +static inline uint64_t ldq_raw(void *ptr) +{ + uint32_t a,b; + a = ldl_raw(ptr); + b = ldl_raw(ptr+4); + return (((uint64_t)a<<32)|b); +} + +static inline void stw_raw(void *ptr, int v) +{ + uint8_t *d = (uint8_t *) ptr; + d[0] = v >> 8; + d[1] = v; +} + +static inline void stl_raw(void *ptr, int v) +{ + uint8_t *d = (uint8_t *) ptr; + d[0] = v >> 24; + d[1] = v >> 16; + d[2] = v >> 8; + d[3] = v; +} + +static inline void stq_raw(void *ptr, uint64_t v) +{ + stl_raw(ptr, v); + stl_raw(ptr+4, v >> 32); +} + #else -static inline int lduw(void *ptr) +static inline int lduw_raw(void *ptr) { return *(uint16_t *)ptr; } -static inline int ldsw(void *ptr) +static inline int ldsw_raw(void *ptr) { return *(int16_t *)ptr; } -static inline int ldl(void *ptr) +static inline int ldl_raw(void *ptr) { return *(uint32_t *)ptr; } -static inline uint64_t ldq(void *ptr) +static inline uint64_t ldq_raw(void *ptr) { return *(uint64_t *)ptr; } -static inline void stw(void *ptr, int v) +static inline void stw_raw(void *ptr, int v) { *(uint16_t *)ptr = v; } -static inline void stl(void *ptr, int v) +static inline void stl_raw(void *ptr, int v) { *(uint32_t *)ptr = v; } -static inline void stq(void *ptr, uint64_t v) +static inline void stq_raw(void *ptr, uint64_t v) { *(uint64_t *)ptr = v; } /* float access */ -static inline float ldfl(void *ptr) +static inline float ldfl_raw(void *ptr) { return *(float *)ptr; } -static inline double ldfq(void *ptr) +static inline double ldfq_raw(void *ptr) { return *(double *)ptr; } -static inline void stfl(void *ptr, float v) +static inline void stfl_raw(void *ptr, float v) { *(float *)ptr = v; } -static inline void stfq(void *ptr, double v) +static inline void stfq_raw(void *ptr, double v) { *(double *)ptr = v; } #endif +/* MMU memory access macros */ + +#if defined(CONFIG_USER_ONLY) + +/* if user mode, no other memory access functions */ +#define ldub(p) ldub_raw(p) +#define ldsb(p) ldsb_raw(p) +#define lduw(p) lduw_raw(p) +#define ldsw(p) ldsw_raw(p) +#define ldl(p) ldl_raw(p) +#define ldq(p) ldq_raw(p) +#define ldfl(p) ldfl_raw(p) +#define ldfq(p) ldfq_raw(p) +#define stb(p, v) stb_raw(p, v) +#define stw(p, v) stw_raw(p, v) +#define stl(p, v) stl_raw(p, v) +#define stq(p, v) stq_raw(p, v) +#define stfl(p, v) stfl_raw(p, v) +#define stfq(p, v) stfq_raw(p, v) + +#define ldub_code(p) ldub_raw(p) +#define ldsb_code(p) ldsb_raw(p) +#define lduw_code(p) lduw_raw(p) +#define ldsw_code(p) ldsw_raw(p) +#define ldl_code(p) ldl_raw(p) + +#define ldub_kernel(p) ldub_raw(p) +#define ldsb_kernel(p) ldsb_raw(p) +#define lduw_kernel(p) lduw_raw(p) +#define ldsw_kernel(p) ldsw_raw(p) +#define ldl_kernel(p) ldl_raw(p) +#define stb_kernel(p, v) stb_raw(p, v) +#define stw_kernel(p, v) stw_raw(p, v) +#define stl_kernel(p, v) stl_raw(p, v) +#define stq_kernel(p, v) stq_raw(p, v) + +#endif /* defined(CONFIG_USER_ONLY) */ + /* page related stuff */ #define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS) @@ -296,12 +386,54 @@ void page_unprotect_range(uint8_t *data, unsigned long data_size); #define cpu_interrupt cpu_arm_interrupt #define cpu_signal_handler cpu_arm_signal_handler +#elif defined(TARGET_SPARC) + +#define CPUState CPUSPARCState +#define cpu_init cpu_sparc_init +#define cpu_exec cpu_sparc_exec +#define cpu_gen_code cpu_sparc_gen_code +#define cpu_interrupt cpu_sparc_interrupt +#define cpu_signal_handler cpu_sparc_signal_handler + #else #error unsupported target CPU #endif -#endif +#endif /* SINGLE_CPU_DEFINES */ + +#define DEFAULT_GDBSTUB_PORT 1234 + +void cpu_abort(CPUState *env, const char *fmt, ...); +extern CPUState *cpu_single_env; + +#define CPU_INTERRUPT_EXIT 0x01 /* wants exit from main loop */ +#define CPU_INTERRUPT_HARD 0x02 /* hardware interrupt pending */ +void cpu_interrupt(CPUState *s, int mask); + +int cpu_breakpoint_insert(CPUState *env, uint32_t pc); +int cpu_breakpoint_remove(CPUState *env, uint32_t pc); +void cpu_single_step(CPUState *env, int enabled); + +#define CPU_LOG_ALL 1 +void cpu_set_log(int log_flags); +void cpu_set_log_filename(const char *filename); + +/* memory API */ + +typedef void CPUWriteMemoryFunc(uint32_t addr, uint32_t value); +typedef uint32_t CPUReadMemoryFunc(uint32_t addr); + +void cpu_register_physical_memory(unsigned long start_addr, unsigned long size, + long phys_offset); +int cpu_register_io_memory(int io_index, + CPUReadMemoryFunc **mem_read, + CPUWriteMemoryFunc **mem_write); + +/* gdb stub API */ +extern int gdbstub_fd; +CPUState *cpu_gdbstub_get_env(void *opaque); +int cpu_gdbstub(void *opaque, int (*main_loop)(void *opaque), int port); #endif /* CPU_ALL_H */