On Thu, Sep 1, 2011 at 8:45 PM, Max Filippov <jcmvb...@gmail.com> wrote: > Signed-off-by: Max Filippov <jcmvb...@gmail.com> > --- > Makefile.target | 2 + > arch_init.c | 2 + > arch_init.h | 1 + > cpu-exec.c | 2 + > elf.h | 2 + > hw/xtensa_pic.c | 38 ++++++++++++++++++ > target-xtensa/cpu.h | 95 > +++++++++++++++++++++++++++++++++++++++++++++ > target-xtensa/helper.c | 73 ++++++++++++++++++++++++++++++++++ > target-xtensa/machine.c | 38 ++++++++++++++++++ > target-xtensa/op_helper.c | 52 ++++++++++++++++++++++++ > target-xtensa/translate.c | 67 +++++++++++++++++++++++++++++++ > 11 files changed, 372 insertions(+), 0 deletions(-) > create mode 100644 hw/xtensa_pic.c > create mode 100644 target-xtensa/cpu.h > create mode 100644 target-xtensa/helper.c > create mode 100644 target-xtensa/machine.c > create mode 100644 target-xtensa/op_helper.c > create mode 100644 target-xtensa/translate.c > > diff --git a/Makefile.target b/Makefile.target > index 07af4d4..b833c10 100644 > --- a/Makefile.target > +++ b/Makefile.target > @@ -373,6 +373,8 @@ obj-s390x-y = s390-virtio-bus.o s390-virtio.o > obj-alpha-y = i8259.o mc146818rtc.o > obj-alpha-y += vga.o cirrus_vga.o > > +obj-xtensa-y += xtensa_pic.o > + > main.o: QEMU_CFLAGS+=$(GPROF_CFLAGS) > > monitor.o: hmp-commands.h qmp-commands.h > diff --git a/arch_init.c b/arch_init.c > index 567ab32..9a5a0e3 100644 > --- a/arch_init.c > +++ b/arch_init.c > @@ -78,6 +78,8 @@ const char arch_config_name[] = CONFIG_QEMU_CONFDIR > "/target-" TARGET_ARCH ".con > #define QEMU_ARCH QEMU_ARCH_SH4 > #elif defined(TARGET_SPARC) > #define QEMU_ARCH QEMU_ARCH_SPARC > +#elif defined(TARGET_XTENSA) > +#define QEMU_ARCH QEMU_ARCH_XTENSA > #endif > > const uint32_t arch_type = QEMU_ARCH; > diff --git a/arch_init.h b/arch_init.h > index 2de9f08..a74187a 100644 > --- a/arch_init.h > +++ b/arch_init.h > @@ -17,6 +17,7 @@ enum { > QEMU_ARCH_S390X = 512, > QEMU_ARCH_SH4 = 1024, > QEMU_ARCH_SPARC = 2048, > + QEMU_ARCH_XTENSA = 4096, > }; > > extern const uint32_t arch_type; > diff --git a/cpu-exec.c b/cpu-exec.c > index de0d716..3fce033 100644 > --- a/cpu-exec.c > +++ b/cpu-exec.c > @@ -222,6 +222,7 @@ int cpu_exec(CPUState *env) > #elif defined(TARGET_SH4) > #elif defined(TARGET_CRIS) > #elif defined(TARGET_S390X) > +#elif defined(TARGET_XTENSA) > /* XXXXX */ > #else > #error unsupported target CPU > @@ -616,6 +617,7 @@ int cpu_exec(CPUState *env) > #elif defined(TARGET_ALPHA) > #elif defined(TARGET_CRIS) > #elif defined(TARGET_S390X) > +#elif defined(TARGET_XTENSA) > /* XXXXX */ > #else > #error unsupported target CPU > diff --git a/elf.h b/elf.h > index ffcac7e..2e05d34 100644 > --- a/elf.h > +++ b/elf.h > @@ -125,6 +125,8 @@ typedef int64_t Elf64_Sxword; > #define EM_MICROBLAZE 189 > #define EM_MICROBLAZE_OLD 0xBAAB > > +#define EM_XTENSA 94 /* Tensilica Xtensa */ > + > /* This is the info that is needed to parse the dynamic section of the file > */ > #define DT_NULL 0 > #define DT_NEEDED 1 > diff --git a/hw/xtensa_pic.c b/hw/xtensa_pic.c > new file mode 100644 > index 0000000..91a5445 > --- /dev/null > +++ b/hw/xtensa_pic.c > @@ -0,0 +1,38 @@ > +/* > + * Copyright (c) 2011, Max Filippov, Open Source and Linux Lab. > + * All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions are > met: > + * * Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * * Neither the name of the Open Source and Linux Lab nor the > + * names of its contributors may be used to endorse or promote products > + * derived from this software without specific prior written > permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" > + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY > + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES > + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR > SERVICES; > + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED > AND > + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS > + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include "hw.h" > +#include "pc.h" > + > +/* Stub functions for hardware that doesn't exist. */ > +void pic_info(Monitor *mon) > +{ > +} > + > +void irq_info(Monitor *mon) > +{ > +} > diff --git a/target-xtensa/cpu.h b/target-xtensa/cpu.h > new file mode 100644 > index 0000000..a51ffc8 > --- /dev/null > +++ b/target-xtensa/cpu.h > @@ -0,0 +1,95 @@ > +/* > + * Copyright (c) 2011, Max Filippov, Open Source and Linux Lab. > + * All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions are > met: > + * * Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * * Neither the name of the Open Source and Linux Lab nor the > + * names of its contributors may be used to endorse or promote products > + * derived from this software without specific prior written > permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" > + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY > + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES > + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR > SERVICES; > + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED > AND > + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS > + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#ifndef CPU_XTENSA_H > +#define CPU_XTENSA_H > + > +#define TARGET_LONG_BITS 32 > +#define ELF_MACHINE EM_XTENSA > + > +#define CPUState struct CPUXtensaState > + > +#include "config.h" > +#include "qemu-common.h" > +#include "cpu-defs.h" > + > +#define TARGET_HAS_ICE 1 > + > +#define NB_MMU_MODES 4 > + > +#define TARGET_PHYS_ADDR_SPACE_BITS 32 > +#define TARGET_VIRT_ADDR_SPACE_BITS 32 > +#define TARGET_PAGE_BITS 12 > + > +typedef struct CPUXtensaState { > + uint32_t regs[16]; > + uint32_t pc; > + uint32_t sregs[256]; > + > + CPU_COMMON > +} CPUXtensaState; > + > +#define cpu_init cpu_xtensa_init > +#define cpu_exec cpu_xtensa_exec > +#define cpu_gen_code cpu_xtensa_gen_code > +#define cpu_signal_handler cpu_xtensa_signal_handler > +#define cpu_list xtensa_cpu_list > + > +CPUXtensaState *cpu_xtensa_init(const char *cpu_model); > +void xtensa_translate_init(void); > +int cpu_xtensa_exec(CPUXtensaState *s); > +void do_interrupt(CPUXtensaState *s); > +int cpu_xtensa_signal_handler(int host_signum, void *pinfo, void *puc); > +void xtensa_cpu_list(FILE *f, fprintf_function cpu_fprintf); > + > +static inline int cpu_mmu_index(CPUState *env) > +{ > + return 0; > +} > + > +static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc, > + target_ulong *cs_base, int *flags) > +{ > + *pc = env->pc; > + *cs_base = 0; > + *flags = 0; > +} > + > +#include "cpu-all.h" > +#include "exec-all.h" > + > +static inline int cpu_has_work(CPUState *env) > +{ > + return 1; > +} > + > +static inline void cpu_pc_from_tb(CPUState *env, TranslationBlock *tb) > +{ > + env->pc = tb->pc; > +} > + > +#endif > diff --git a/target-xtensa/helper.c b/target-xtensa/helper.c > new file mode 100644 > index 0000000..dc30e00 > --- /dev/null > +++ b/target-xtensa/helper.c > @@ -0,0 +1,73 @@ > +/* > + * Copyright (c) 2011, Max Filippov, Open Source and Linux Lab. > + * All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions are > met: > + * * Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * * Neither the name of the Open Source and Linux Lab nor the > + * names of its contributors may be used to endorse or promote products > + * derived from this software without specific prior written > permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" > + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY > + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES > + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR > SERVICES; > + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED > AND > + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS > + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include "cpu.h" > +#include "exec-all.h" > +#include "gdbstub.h" > +#include "qemu-common.h" > +#include "host-utils.h" > +#if !defined(CONFIG_USER_ONLY) > +#include "hw/loader.h" > +#endif > + > +void cpu_reset(CPUXtensaState *env) > +{ > + env->pc = 0; > +} > + > +CPUXtensaState *cpu_xtensa_init(const char *cpu_model) > +{ > + static int tcg_inited; > + CPUXtensaState *env; > + > + env = g_malloc0(sizeof(*env)); > + cpu_exec_init(env); > + > + if (!tcg_inited) { > + tcg_inited = 1; > + xtensa_translate_init(); > + } > + > + qemu_init_vcpu(env); > + return env; > +} > + > + > +void xtensa_cpu_list(FILE *f, fprintf_function cpu_fprintf) > +{ > + cpu_fprintf(f, "Available CPUs:\n" > + " Xtensa core\n"); > +} > + > +target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr) > +{ > + return addr; > +} > + > +void do_interrupt(CPUState *env) > +{ > +} > diff --git a/target-xtensa/machine.c b/target-xtensa/machine.c > new file mode 100644 > index 0000000..ddeffb2 > --- /dev/null > +++ b/target-xtensa/machine.c > @@ -0,0 +1,38 @@ > +/* > + * Copyright (c) 2011, Max Filippov, Open Source and Linux Lab. > + * All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions are > met: > + * * Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * * Neither the name of the Open Source and Linux Lab nor the > + * names of its contributors may be used to endorse or promote products > + * derived from this software without specific prior written > permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" > + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY > + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES > + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR > SERVICES; > + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED > AND > + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS > + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include "hw/hw.h" > +#include "hw/boards.h" > + > +void cpu_save(QEMUFile *f, void *opaque) > +{ > +} > + > +int cpu_load(QEMUFile *f, void *opaque, int version_id) > +{ > + return 0; > +} > diff --git a/target-xtensa/op_helper.c b/target-xtensa/op_helper.c > new file mode 100644 > index 0000000..aafa33d > --- /dev/null > +++ b/target-xtensa/op_helper.c > @@ -0,0 +1,52 @@ > +/* > + * Copyright (c) 2011, Max Filippov, Open Source and Linux Lab. > + * All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions are > met: > + * * Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * * Neither the name of the Open Source and Linux Lab nor the > + * names of its contributors may be used to endorse or promote products > + * derived from this software without specific prior written > permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" > + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY > + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES > + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR > SERVICES; > + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED > AND > + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS > + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include "cpu.h" > +#include "dyngen-exec.h" > + > +#define MMUSUFFIX _mmu > + > +#define SHIFT 0 > +#include "softmmu_template.h" > + > +#define SHIFT 1 > +#include "softmmu_template.h" > + > +#define SHIFT 2 > +#include "softmmu_template.h" > + > +#define SHIFT 3 > +#include "softmmu_template.h" > + > +void tlb_fill(target_ulong addr, int is_write, int mmu_idx, void *retaddr) > +{ > + tlb_set_page(cpu_single_env, > + addr & ~(TARGET_PAGE_SIZE - 1), > + addr & ~(TARGET_PAGE_SIZE - 1), > + PAGE_READ | PAGE_WRITE | PAGE_EXEC, > + mmu_idx, TARGET_PAGE_SIZE); > +} > diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c > new file mode 100644 > index 0000000..e91d8a5 > --- /dev/null > +++ b/target-xtensa/translate.c > @@ -0,0 +1,67 @@ > +/* > + * Xtensa ISA: > + * > http://www.tensilica.com/products/literature-docs/documentation/xtensa-isa-databook.htm > + * > + * Copyright (c) 2011, Max Filippov, Open Source and Linux Lab. > + * All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions are > met: > + * * Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * * Neither the name of the Open Source and Linux Lab nor the > + * names of its contributors may be used to endorse or promote products > + * derived from this software without specific prior written > permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" > + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY > + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES > + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR > SERVICES; > + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED > AND > + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS > + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include <stdio.h> > + > +#include "cpu.h" > +#include "exec-all.h" > +#include "disas.h" > +#include "tcg-op.h" > +#include "qemu-log.h" > + > + > +void xtensa_translate_init(void) > +{ > +} > + > +void gen_intermediate_code(CPUState *env, TranslationBlock *tb) > +{ > +} > + > +void gen_intermediate_code_pc(CPUState *env, TranslationBlock *tb) > +{ > +} > + > +void cpu_dump_state(CPUState *env, FILE *f, fprintf_function cpu_fprintf, > + int flags) > +{ > + int i; > + > + cpu_fprintf(f, "PC=%08x\n", env->pc); > + > + for (i = 0; i < 16; ++i)
Missing braces. > + cpu_fprintf(f, "A%02d=%08x%c", i, env->regs[i], > + (i % 4) == 3 ? '\n' : ' '); > +} > + > +void restore_state_to_opc(CPUState *env, TranslationBlock *tb, int pc_pos) > +{ > + env->pc = gen_opc_pc[pc_pos]; > +} > -- > 1.7.6 > > >