diff mbox

[01/15] target-tricore: Add target stubs and qom-cpu

Message ID 1404756822-3253-2-git-send-email-kbastian@mail.uni-paderborn.de
State New
Headers show

Commit Message

Bastian Koppelmann July 7, 2014, 6:13 p.m. UTC
Add TriCore target stubs, QOM cpu and basic machine.

Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
 arch_init.c                         |   2 +
 configure                           |  13 ++
 cpu-exec.c                          |  11 +-
 cpus.c                              |   6 +
 default-configs/tricore-softmmu.mak |   3 +
 include/elf.h                       |   2 +
 include/sysemu/arch_init.h          |   1 +
 target-tricore/Makefile.objs        |   2 +
 target-tricore/cpu-qom.h            |  71 +++++++
 target-tricore/cpu.c                | 121 ++++++++++++
 target-tricore/cpu.h                | 380 ++++++++++++++++++++++++++++++++++++
 target-tricore/helper.c             |  36 ++++
 target-tricore/helper.h             |   0
 target-tricore/machine.c            |  21 ++
 target-tricore/op_helper.c          |  27 +++
 target-tricore/translate.c          | 108 ++++++++++
 target-tricore/translate_init.c     |  21 ++
 target-tricore/tricore-defs.h       |  28 +++
 user-exec.c                         |  17 ++
 19 files changed, 869 insertions(+), 1 deletion(-)
 create mode 100644 default-configs/tricore-softmmu.mak
 create mode 100644 target-tricore/Makefile.objs
 create mode 100644 target-tricore/cpu-qom.h
 create mode 100644 target-tricore/cpu.c
 create mode 100644 target-tricore/cpu.h
 create mode 100644 target-tricore/helper.c
 create mode 100644 target-tricore/helper.h
 create mode 100644 target-tricore/machine.c
 create mode 100644 target-tricore/op_helper.c
 create mode 100644 target-tricore/translate.c
 create mode 100644 target-tricore/translate_init.c
 create mode 100644 target-tricore/tricore-defs.h

Comments

Richard Henderson July 7, 2014, 7:09 p.m. UTC | #1
On 07/07/2014 11:13 AM, Bastian Koppelmann wrote:
>      QEMU_ARCH_MOXIE = 0x8000,
> +    QEMU_ARCH_TRICORE = 0x16000,

Hexidecimal, not decimal doubling.

This file is a mess, I agree.  A separate patch to standardize the existing
numbers to hex would be appreciated.


r~
Richard Henderson July 7, 2014, 7:14 p.m. UTC | #2
On 07/07/2014 11:13 AM, Bastian Koppelmann wrote:
> +
> +    /* GPR Register */
> +    target_ulong gpr_a[16];
> +    target_ulong gpr_d[16];
> +};
> +
> +typedef struct tricore_def_t tricore_def_t;
> +
> +typedef struct CPUTRICOREState CPUTRICOREState;
> +struct CPUTRICOREState {
> +    TCState active_tc;

You'll get better code generation if you put the gprs first.  Some hosts will
need a 2 insn sequence for large offsets, and even x86 will have a code size
benefit from having offsets < 128.

Is there any real need for the active_tc thing, or did you just copy MIPS?
Personally, I dislike it, and unless you're planning on using structure
assignment to copy data around during certain context switches, please drop it.


r~
Peter Maydell July 7, 2014, 7:24 p.m. UTC | #3
On 7 July 2014 19:13, Bastian Koppelmann <kbastian@mail.uni-paderborn.de> wrote:
> Add TriCore target stubs, QOM cpu and basic machine.
>
> Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
> ---
>  arch_init.c                         |   2 +
>  configure                           |  13 ++
>  cpu-exec.c                          |  11 +-
>  cpus.c                              |   6 +
>  default-configs/tricore-softmmu.mak |   3 +
>  include/elf.h                       |   2 +
>  include/sysemu/arch_init.h          |   1 +
>  target-tricore/Makefile.objs        |   2 +
>  target-tricore/cpu-qom.h            |  71 +++++++
>  target-tricore/cpu.c                | 121 ++++++++++++
>  target-tricore/cpu.h                | 380 ++++++++++++++++++++++++++++++++++++
>  target-tricore/helper.c             |  36 ++++
>  target-tricore/helper.h             |   0
>  target-tricore/machine.c            |  21 ++
>  target-tricore/op_helper.c          |  27 +++
>  target-tricore/translate.c          | 108 ++++++++++
>  target-tricore/translate_init.c     |  21 ++
>  target-tricore/tricore-defs.h       |  28 +++
>  user-exec.c                         |  17 ++
>  19 files changed, 869 insertions(+), 1 deletion(-)
>  create mode 100644 default-configs/tricore-softmmu.mak
>  create mode 100644 target-tricore/Makefile.objs
>  create mode 100644 target-tricore/cpu-qom.h
>  create mode 100644 target-tricore/cpu.c
>  create mode 100644 target-tricore/cpu.h
>  create mode 100644 target-tricore/helper.c
>  create mode 100644 target-tricore/helper.h
>  create mode 100644 target-tricore/machine.c
>  create mode 100644 target-tricore/op_helper.c
>  create mode 100644 target-tricore/translate.c
>  create mode 100644 target-tricore/translate_init.c
>  create mode 100644 target-tricore/tricore-defs.h

I think you probably want the configure and default-configs changes
to be at the end of the patch series (or at least part way through it),
not at the start.
The general approach is:
 * some patches which implement the basic absolute minimum
    functionality, usefully split up
 * then add the configure and default-configs changes that allow
    the user to select the target and include it in the default target
    list

> diff --git a/configure b/configure
> index 7dd43fd..a976862 100755
> --- a/configure
> +++ b/configure
> @@ -495,6 +495,8 @@ elif check_define __mips__ ; then
>    cpu="mips"
>  elif check_define __ia64__ ; then
>    cpu="ia64"
> +elif check_define __tricore__ ; then
> +  cpu="tricore"
>  elif check_define __s390__ ; then
>    if check_define __s390x__ ; then
>      cpu="s390x"

This is for supporting compilation of QEMU on a tricore
*host*. That is a bit pointless since you don't provide a
TCG target backend. In any case if you want to add support
for that I suggest restricting it to its own separate patchset.

> @@ -533,6 +535,9 @@ case "$cpu" in
>    mips*)
>      cpu="mips"
>    ;;
> +  tricore*)
> +    cpu="tricore"
> +  ;;

Also host CPU related. (I suggest looking at where the
configure script handles the "moxie" target type, since that's
an example of a CPU type we handle only as a guest CPU
and not as a host CPU, so it's a good indication of where you
need to add tricore cases.)

>    sparc|sun4[cdmuv])
>      cpu="sparc"
>    ;;
> @@ -4958,6 +4963,10 @@ case "$target_name" in
>      TARGET_BASE_ARCH=mips
>      echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
>    ;;
> +  tricore)
> +    TARGET_ARCH=tricore

You don't need this line, because the default value for
TARGET_ARCH is the target name; only those cases in this
case statement where the CPU target name might be different
need to set TARGET_ARCH specifically.

> +    target_phys_bits=32
> +  ;;
>    moxie)
>    ;;
>    or32)
> @@ -5155,6 +5164,10 @@ for i in $ARCH $TARGET_BASE_ARCH ; do
>      echo "CONFIG_MIPS_DIS=y"  >> $config_target_mak
>      echo "CONFIG_MIPS_DIS=y"  >> config-all-disas.mak
>    ;;
> +  tricore*)
> +    echo "CONFIG_TRICORE_DIS=y" >> $config_target_mak
> +    echo "CONFIG_TRICORE_DIS=y" >> config-all-disas.mak
> +  ;;

Diffstat says you haven't got a disassembler in this patch,
so what is this for? Don't add it until/unless you add the
disassembler code.

> --- /dev/null
> +++ b/target-tricore/machine.c
> @@ -0,0 +1,21 @@
> +/*
> + *  Copyright (c) 2012-2014 Bastian Koppelmann C-Lab/University Paderborn
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include "hw/hw.h"
> +#include "hw/boards.h"
> +
> +#include "cpu.h"

This file has no content; don't add it until it's got some useful code in it...

> diff --git a/user-exec.c b/user-exec.c
> index 1ff8673..beba4d5 100644
> --- a/user-exec.c
> +++ b/user-exec.c
> @@ -614,6 +614,23 @@ int cpu_signal_handler(int host_signum, void *pinfo,
>                               is_write, &uc->uc_sigmask, puc);
>  }
>
> +#elif defined(__tricore__)
> +
> +int cpu_signal_handler(int host_signum, void *pinfo,
> +                       void *puc)
> +{
> +    printf("cpu_signal_handler\n");
> +  /*  siginfo_t *info = pinfo;
> +    struct ucontext *uc = puc;
> +    greg_t pc = uc->uc_mcontext.pc;
> +    int is_write;
> +    is_write = 0;
> +    return handle_cpu_signal(pc, (unsigned long)info->si_addr,
> +                             is_write, &uc->uc_sigmask, puc);*/
> +    return 0;
> +}
> +
> +

This is also host-CPU support; don't put it in this patchset.
(Also, don't include commented out code like that...)

thanks
-- PMM
Bastian Koppelmann July 11, 2014, 11:05 a.m. UTC | #4
Hi Peter,

On 07/07/2014 08:24 PM, Peter Maydell wrote:
> I think you probably want the configure and default-configs changes to 
> be at the end of the patch series (or at least part way through it), 
> not at the start. The general approach is: * some patches which 
> implement the basic absolute minimum functionality, usefully split up 
> * then add the configure and default-configs changes that allow the 
> user to select the target and include it in the default target list
Would you recommend to add the part, which activates the target, at the 
end of this patch series or at the end of the implementation of the target?

thanks,

Bastian
Peter Maydell July 11, 2014, 11:10 a.m. UTC | #5
On 11 July 2014 12:05, Bastian Koppelmann
<kbastian@mail.uni-paderborn.de> wrote:
> On 07/07/2014 08:24 PM, Peter Maydell wrote:
>> I think you probably want the configure and default-configs changes to be
>> at the end of the patch series (or at least part way through it), not at the
>> start. The general approach is: * some patches which implement the basic
>> absolute minimum functionality, usefully split up * then add the configure
>> and default-configs changes that allow the user to select the target and
>> include it in the default target list
>
> Would you recommend to add the part, which activates the target, at the end
> of this patch series or at the end of the implementation of the target?

I would add it at the point where the target can at least build
and attempt to execute a guest binary, even if every instruction
is actually undefined.

thanks
-- PMM
diff mbox

Patch

diff --git a/arch_init.c b/arch_init.c
index 8ddaf35..29a5821 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -104,6 +104,8 @@  int graphic_depth = 32;
 #define QEMU_ARCH QEMU_ARCH_XTENSA
 #elif defined(TARGET_UNICORE32)
 #define QEMU_ARCH QEMU_ARCH_UNICORE32
+#elif defined(TARGET_TRICORE)
+#define QEMU_ARCH QEMU_ARCH_TRICORE
 #endif
 
 const uint32_t arch_type = QEMU_ARCH;
diff --git a/configure b/configure
index 7dd43fd..a976862 100755
--- a/configure
+++ b/configure
@@ -495,6 +495,8 @@  elif check_define __mips__ ; then
   cpu="mips"
 elif check_define __ia64__ ; then
   cpu="ia64"
+elif check_define __tricore__ ; then
+  cpu="tricore"
 elif check_define __s390__ ; then
   if check_define __s390x__ ; then
     cpu="s390x"
@@ -533,6 +535,9 @@  case "$cpu" in
   mips*)
     cpu="mips"
   ;;
+  tricore*)
+    cpu="tricore"
+  ;;
   sparc|sun4[cdmuv])
     cpu="sparc"
   ;;
@@ -4958,6 +4963,10 @@  case "$target_name" in
     TARGET_BASE_ARCH=mips
     echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
   ;;
+  tricore)
+    TARGET_ARCH=tricore
+    target_phys_bits=32
+  ;;
   moxie)
   ;;
   or32)
@@ -5155,6 +5164,10 @@  for i in $ARCH $TARGET_BASE_ARCH ; do
     echo "CONFIG_MIPS_DIS=y"  >> $config_target_mak
     echo "CONFIG_MIPS_DIS=y"  >> config-all-disas.mak
   ;;
+  tricore*)
+    echo "CONFIG_TRICORE_DIS=y" >> $config_target_mak
+    echo "CONFIG_TRICORE_DIS=y" >> config-all-disas.mak
+  ;;
   moxie*)
     echo "CONFIG_MOXIE_DIS=y"  >> $config_target_mak
     echo "CONFIG_MOXIE_DIS=y"  >> config-all-disas.mak
diff --git a/cpu-exec.c b/cpu-exec.c
index 38e5f02..bcfa943 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -277,6 +277,7 @@  int cpu_exec(CPUArchState *env)
 #elif defined(TARGET_CRIS)
 #elif defined(TARGET_S390X)
 #elif defined(TARGET_XTENSA)
+#elif defined(TARGET_TRICORE)
     /* XXXXX */
 #else
 #error unsupported target CPU
@@ -327,7 +328,8 @@  int cpu_exec(CPUArchState *env)
                     }
 #if defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_MIPS) || \
     defined(TARGET_PPC) || defined(TARGET_ALPHA) || defined(TARGET_CRIS) || \
-    defined(TARGET_MICROBLAZE) || defined(TARGET_LM32) || defined(TARGET_UNICORE32)
+    defined(TARGET_MICROBLAZE) || defined(TARGET_LM32) ||                   \
+    defined(TARGET_UNICORE32) || defined(TARGET_TRICORE)
                     if (interrupt_request & CPU_INTERRUPT_HALT) {
                         cpu->interrupt_request &= ~CPU_INTERRUPT_HALT;
                         cpu->halted = 1;
@@ -443,6 +445,12 @@  int cpu_exec(CPUArchState *env)
                         cc->do_interrupt(cpu);
                         next_tb = 0;
                     }
+#elif defined(TARGET_TRICORE)
+                    if ((interrupt_request & CPU_INTERRUPT_HARD)) {
+                        cc->do_interrupt(cpu);
+                        next_tb = 0;
+                    }
+
 #elif defined(TARGET_OPENRISC)
                     {
                         int idx = -1;
@@ -724,6 +732,7 @@  int cpu_exec(CPUArchState *env)
               | env->cc_dest | (env->cc_x << 4);
 #elif defined(TARGET_MICROBLAZE)
 #elif defined(TARGET_MIPS)
+#elif defined(TARGET_TRICORE)
 #elif defined(TARGET_MOXIE)
 #elif defined(TARGET_OPENRISC)
 #elif defined(TARGET_SH4)
diff --git a/cpus.c b/cpus.c
index 5e7f2cf..fb0be13 100644
--- a/cpus.c
+++ b/cpus.c
@@ -1342,6 +1342,9 @@  CpuInfoList *qmp_query_cpus(Error **errp)
 #elif defined(TARGET_MIPS)
         MIPSCPU *mips_cpu = MIPS_CPU(cpu);
         CPUMIPSState *env = &mips_cpu->env;
+#elif defined(TARGET_TRICORE)
+        TRICORECPU *tricore_cpu = TRICORE_CPU(cpu);
+        CPUTRICOREState *env = &tricore_cpu->env;
 #endif
 
         cpu_synchronize_state(cpu);
@@ -1366,6 +1369,9 @@  CpuInfoList *qmp_query_cpus(Error **errp)
 #elif defined(TARGET_MIPS)
         info->value->has_PC = true;
         info->value->PC = env->active_tc.PC;
+#elif defined(TARGET_TRICORE)
+        info->value->has_PC = true;
+        info->value->PC = env->active_tc.PC;
 #endif
 
         /* XXX: waiting for the qapi to support GSList */
diff --git a/default-configs/tricore-softmmu.mak b/default-configs/tricore-softmmu.mak
new file mode 100644
index 0000000..48ccd12
--- /dev/null
+++ b/default-configs/tricore-softmmu.mak
@@ -0,0 +1,3 @@ 
+include pci.mak
+CONFIG_PFLASH_CFI01=y
+CONFIG_SMC91C111=y
diff --git a/include/elf.h b/include/elf.h
index e88d52f..70107f0 100644
--- a/include/elf.h
+++ b/include/elf.h
@@ -92,6 +92,8 @@  typedef int64_t  Elf64_Sxword;
 
 #define EM_SPARCV9     43	/* SPARC v9 64-bit */
 
+#define EM_TRICORE      44      /* Infineon TriCore */
+
 #define EM_IA_64	50	/* HP/Intel IA-64 */
 
 #define EM_X86_64	62	/* AMD x86-64 */
diff --git a/include/sysemu/arch_init.h b/include/sysemu/arch_init.h
index 182d48d..3fc56ef 100644
--- a/include/sysemu/arch_init.h
+++ b/include/sysemu/arch_init.h
@@ -22,6 +22,7 @@  enum {
     QEMU_ARCH_OPENRISC = 8192,
     QEMU_ARCH_UNICORE32 = 0x4000,
     QEMU_ARCH_MOXIE = 0x8000,
+    QEMU_ARCH_TRICORE = 0x16000,
 };
 
 extern const uint32_t arch_type;
diff --git a/target-tricore/Makefile.objs b/target-tricore/Makefile.objs
new file mode 100644
index 0000000..b5c7458
--- /dev/null
+++ b/target-tricore/Makefile.objs
@@ -0,0 +1,2 @@ 
+obj-y += translate.o helper.o cpu.o op_helper.o
+obj-$(CONFIG_SOFTMMU) += machine.o
diff --git a/target-tricore/cpu-qom.h b/target-tricore/cpu-qom.h
new file mode 100644
index 0000000..1d57594
--- /dev/null
+++ b/target-tricore/cpu-qom.h
@@ -0,0 +1,71 @@ 
+/*
+ *  Copyright (c) 2012-2013 Bastian Koppelmann C-Lab/University Paderborn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef QEMU_TRICORE_CPU_QOM_H
+#define QEMU_TRICORE_CPU_QOM_H
+
+#include "qom/cpu.h"
+
+
+#define TYPE_TRICORE_CPU "tricore-cpu"
+
+#define TRICORE_CPU_CLASS(klass) \
+    OBJECT_CLASS_CHECK(TRICORECPUClass, (klass), TYPE_TRICORE_CPU)
+#define TRICORE_CPU(obj) \
+    OBJECT_CHECK(TRICORECPU, (obj), TYPE_TRICORE_CPU)
+#define TRICORE_CPU_GET_CLASS(obj) \
+    OBJECT_GET_CLASS(TRICORECPUClass, (obj), TYPE_TRICORE_CPU)
+
+typedef struct TRICORECPUClass {
+    /*< private >*/
+    CPUClass parent_class;
+    /*< public >*/
+
+    DeviceRealize parent_realize;
+    void (*parent_reset)(CPUState *cpu);
+} TRICORECPUClass;
+
+/**
+ * TRICORECPU:
+ * @env: #CPUTRICOREState
+ *
+ * A TRICORE CPU.
+ */
+typedef struct TRICORECPU {
+    /*< private >*/
+    CPUState parent_obj;
+    /*< public >*/
+
+    CPUTRICOREState env;
+} TRICORECPU;
+
+static inline TRICORECPU *tricore_env_get_cpu(CPUTRICOREState *env)
+{
+    return TRICORE_CPU(container_of(env, TRICORECPU, env));
+}
+
+#define ENV_GET_CPU(e) CPU(tricore_env_get_cpu(e))
+
+#define ENV_OFFSET offsetof(TRICORECPU, env)
+
+hwaddr tricore_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
+void tricore_cpu_do_interrupt(CPUState *cpu);
+void tricore_cpu_dump_state(CPUState *cpu, FILE *f,
+                            fprintf_function cpu_fprintf, int flags);
+
+
+#endif /*QEMU_TRICORE_CPU_QOM_H */
diff --git a/target-tricore/cpu.c b/target-tricore/cpu.c
new file mode 100644
index 0000000..2d0bb76
--- /dev/null
+++ b/target-tricore/cpu.c
@@ -0,0 +1,121 @@ 
+/*
+ *  TRICORE emulation for qemu: main translation routines.
+ *
+ *  Copyright (c) 2012-2013 Bastian Koppelmann C-Lab/University Paderborn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "cpu.h"
+#include "qemu-common.h"
+
+
+static void tricore_cpu_set_pc(CPUState *cs, vaddr value)
+{
+    TRICORECPU *cpu = TRICORE_CPU(cs);
+    CPUTRICOREState *env = &cpu->env;
+
+    env->active_tc.PC = value & ~(target_ulong)1;
+}
+
+static void tricore_cpu_synchronize_from_tb(CPUState *cs,
+                                            TranslationBlock *tb)
+{
+    TRICORECPU *cpu = TRICORE_CPU(cs);
+    CPUTRICOREState *env = &cpu->env;
+
+    env->active_tc.PC = tb->pc;
+}
+
+static void tricore_cpu_reset(CPUState *s)
+{
+    TRICORECPU *cpu = TRICORE_CPU(s);
+    TRICORECPUClass *tcc = TRICORE_CPU_GET_CLASS(cpu);
+    CPUTRICOREState *env = &cpu->env;
+
+    tcc->parent_reset(s);
+
+    tlb_flush(s, 1);
+
+    cpu_state_reset(env);
+}
+
+static bool tricore_cpu_has_work(CPUState *cs)
+{
+    return true;
+}
+
+static void tricore_cpu_realizefn(DeviceState *dev, Error **errp)
+{
+    CPUState *cs = CPU(dev);
+    TRICORECPUClass *tcc = TRICORE_CPU_GET_CLASS(dev);
+
+    cpu_reset(cs);
+    qemu_init_vcpu(cs);
+
+    tcc->parent_realize(dev, errp);
+}
+
+
+static void tricore_cpu_initfn(Object *obj)
+{
+    CPUState *cs = CPU(obj);
+    TRICORECPU *cpu = TRICORE_CPU(obj);
+    CPUTRICOREState *env = &cpu->env;
+
+    cs->env_ptr = env;
+    cpu_exec_init(env);
+
+    if (tcg_enabled()) {
+        tricore_tcg_init();
+    }
+}
+
+static void tricore_cpu_class_init(ObjectClass *c, void *data)
+{
+    TRICORECPUClass *mcc = TRICORE_CPU_CLASS(c);
+    CPUClass *cc = CPU_CLASS(c);
+    DeviceClass *dc = DEVICE_CLASS(c);
+
+    mcc->parent_realize = dc->realize;
+    dc->realize = tricore_cpu_realizefn;
+
+    mcc->parent_reset = cc->reset;
+    cc->reset = tricore_cpu_reset;
+    cc->has_work = tricore_cpu_has_work;
+
+    cc->do_interrupt = tricore_cpu_do_interrupt;
+    cc->dump_state = tricore_cpu_dump_state;
+    cc->set_pc = tricore_cpu_set_pc;
+    cc->synchronize_from_tb = tricore_cpu_synchronize_from_tb;
+
+}
+
+
+static const TypeInfo tricore_cpu_type_info = {
+    .name = TYPE_TRICORE_CPU,
+    .parent = TYPE_CPU,
+    .instance_size = sizeof(TRICORECPU),
+    .instance_init = tricore_cpu_initfn,
+    .abstract = false,
+    .class_size = sizeof(TRICORECPUClass),
+    .class_init = tricore_cpu_class_init,
+};
+
+static void tricore_cpu_register_types(void)
+{
+    type_register_static(&tricore_cpu_type_info);
+}
+
+type_init(tricore_cpu_register_types)
diff --git a/target-tricore/cpu.h b/target-tricore/cpu.h
new file mode 100644
index 0000000..8cbcda3
--- /dev/null
+++ b/target-tricore/cpu.h
@@ -0,0 +1,380 @@ 
+/*
+ *  TRICORE emulation for qemu: main CPU struct.
+ *
+ *  Copyright (c) 2012-2013 Bastian Koppelmann C-Lab/University Paderborn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+#if !defined(__TRICORE_CPU_H__)
+#define __TRICORE_CPU_H__
+
+#include "tricore-defs.h"
+#include "config.h"
+#include "qemu-common.h"
+#include "exec/cpu-defs.h"
+#include "fpu/softfloat.h"
+
+#define ELF_MACHINE     EM_TRICORE
+
+#define CPUArchState struct CPUTRICOREState
+
+struct CPUTRICOREState;
+
+#define TRICORE_CPU_IRQ 0
+#define TRICORE_CPU_FIQ 1
+struct tricore_boot_info;
+
+#define NB_MMU_MODES 3
+
+typedef struct TCState TCState;
+struct TCState {
+    /* CSFR Register */
+#define MASK_PCXI_PCPN 0xff000000
+#define MASK_PCXI_PIE  0x00800000
+#define MASK_PCXI_UL   0x00400000
+#define MASK_PCXI_PCXS 0x000f0000
+#define MASK_PCXI_PCXO 0x0000ffff
+    target_ulong PCXI;
+#define MASK_PSW_USB 0xff000000
+#define MASK_USB_C   0x80000000
+#define MASK_USB_V   0x40000000
+#define MASK_USB_SV  0x20000000
+#define MASK_USB_AV  0x10000000
+#define MASK_USB_SAV 0x08000000
+#define MASK_PSW_PRS 0x00003000
+#define MASK_PSW_IO  0x00000c00
+#define MASK_PSW_IS  0x00000200
+#define MASK_PSW_GW  0x00000100
+#define MASK_PSW_CDE 0x00000080
+#define MASK_PSW_CDC 0x0000007f
+    target_ulong PSW;
+    target_ulong PC;
+#define MASK_SYSCON_PRO_TEN 0x2
+#define MASK_SYSCON_FCD_SF  0x1
+    target_ulong SYSCON;
+#define MASK_CPUID_MOD     0xffff0000
+#define MASK_CPUID_MOD_32B 0x0000ff00
+#define MASK_CPUID_REV     0x000000ff
+    target_ulong CPU_ID;
+    target_ulong BIV;
+    target_ulong BTV;
+    target_ulong ISP;
+#define MASK_ICR_PIPN 0x00ff0000
+#define MASK_ICR_IE   0x00000100
+#define MASK_ICR_CCPN 0x000000ff
+    target_ulong ICR;
+#define MASK_FCX_FCXS 0x000f0000
+#define MASK_FCX_FCXO 0x0000ffff
+    target_ulong FCX;
+#define MASK_LCX_LCXS 0x000f0000
+#define MASK_LCX_LCX0 0x0000ffff
+    target_ulong LCX;
+    target_ulong COMPAT;
+
+    /* Mem Protection Register */
+    target_ulong DPR0_0L;
+    target_ulong DPR0_0U;
+    target_ulong DPR0_1L;
+    target_ulong DPR0_1U;
+    target_ulong DPR0_2L;
+    target_ulong DPR0_2U;
+    target_ulong DPR0_3L;
+    target_ulong DPR0_3U;
+
+    target_ulong DPR1_0L;
+    target_ulong DPR1_0U;
+    target_ulong DPR1_1L;
+    target_ulong DPR1_1U;
+    target_ulong DPR1_2L;
+    target_ulong DPR1_2U;
+    target_ulong DPR1_3L;
+    target_ulong DPR1_3U;
+
+    target_ulong DPR2_0L;
+    target_ulong DPR2_0U;
+    target_ulong DPR2_1L;
+    target_ulong DPR2_1U;
+    target_ulong DPR2_2L;
+    target_ulong DPR2_2U;
+    target_ulong DPR2_3L;
+    target_ulong DPR2_3U;
+
+    target_ulong DPR3_0L;
+    target_ulong DPR3_0U;
+    target_ulong DPR3_1L;
+    target_ulong DPR3_1U;
+    target_ulong DPR3_2L;
+    target_ulong DPR3_2U;
+    target_ulong DPR3_3L;
+    target_ulong DPR3_3U;
+
+    target_ulong CPR0_0L;
+    target_ulong CPR0_0U;
+    target_ulong CPR0_1L;
+    target_ulong CPR0_1U;
+    target_ulong CPR0_2L;
+    target_ulong CPR0_2U;
+    target_ulong CPR0_3L;
+    target_ulong CPR0_3U;
+
+    target_ulong CPR1_0L;
+    target_ulong CPR1_0U;
+    target_ulong CPR1_1L;
+    target_ulong CPR1_1U;
+    target_ulong CPR1_2L;
+    target_ulong CPR1_2U;
+    target_ulong CPR1_3L;
+    target_ulong CPR1_3U;
+
+    target_ulong CPR2_0L;
+    target_ulong CPR2_0U;
+    target_ulong CPR2_1L;
+    target_ulong CPR2_1U;
+    target_ulong CPR2_2L;
+    target_ulong CPR2_2U;
+    target_ulong CPR2_3L;
+    target_ulong CPR2_3U;
+
+    target_ulong CPR3_0L;
+    target_ulong CPR3_0U;
+    target_ulong CPR3_1L;
+    target_ulong CPR3_1U;
+    target_ulong CPR3_2L;
+    target_ulong CPR3_2U;
+    target_ulong CPR3_3L;
+    target_ulong CPR3_3U;
+
+    target_ulong DPM0;
+    target_ulong DPM1;
+    target_ulong DPM2;
+    target_ulong DPM3;
+
+    target_ulong CPM0;
+    target_ulong CPM1;
+    target_ulong CPM2;
+    target_ulong CPM3;
+
+    /* Memory Management Registers */
+    target_ulong MMU_CON;
+    target_ulong MMU_ASI;
+    target_ulong MMU_TVA;
+    target_ulong MMU_TPA;
+    target_ulong MMU_TPX;
+    target_ulong MMU_TFA;
+    /* {1.3.1 only */
+    target_ulong BMACON;
+    target_ulong SMACON;
+    target_ulong DIEAR;
+    target_ulong DIETR;
+    target_ulong CCDIER;
+    target_ulong MIECON;
+    target_ulong PIEAR;
+    target_ulong PIETR;
+    target_ulong CCPIER;
+    /*} */
+    /* Debug Registers */
+    target_ulong DBGSR;
+    target_ulong EXEVT;
+    target_ulong CREVT;
+    target_ulong SWEVT;
+    target_ulong TR0EVT;
+    target_ulong TR1EVT;
+    target_ulong DMS;
+    target_ulong DCX;
+    target_ulong DBGTCR;
+    target_ulong CCTRL;
+    target_ulong CCNT;
+    target_ulong ICNT;
+    target_ulong M1CNT;
+    target_ulong M2CNT;
+    target_ulong M3CNT;
+    /* Floating Point Registers */
+    /* XXX: */
+
+    /* GPR Register */
+    target_ulong gpr_a[16];
+    target_ulong gpr_d[16];
+};
+
+typedef struct tricore_def_t tricore_def_t;
+
+typedef struct CPUTRICOREState CPUTRICOREState;
+struct CPUTRICOREState {
+    TCState active_tc;
+
+    /* QEMU */
+    int error_code;
+    uint32_t hflags;    /* CPU State */
+
+    #define TRICORE_PSW_IO 0x600
+
+    #define TRICORE_HFLAG_UM0     0x00002 /* user mode-0 flag          */
+    #define TRICORE_HFLAG_UM1     0x00001 /* user mode-1 flag          */
+    #define TRICORE_HFLAG_SM      0x00000 /* kernel mode flag          */
+
+    CPU_COMMON
+
+    const tricore_def_t *cpu_model;
+    void *irq[8];
+    struct QEMUTimer *timer; /* Internal timer */
+};
+
+/* TriCore Traps Classes*/
+enum {
+    TRAPC_NONE     = -1,
+    TRAPC_MMU      = 0,
+    TRAPC_PROT     = 1,
+    TRAPC_INSN_ERR = 2,
+    TRAPC_CTX_MNG  = 3,
+    TRAPC_SYSBUS   = 4,
+    TRAPC_ASSERT   = 5,
+    TRAPC_SYSCALL  = 6,
+    TRAPC_NMI      = 7,
+};
+
+/* Class 0 TIN */
+enum {
+    TIN0_VAF = 0,
+    TIN0_VAP = 1,
+};
+
+/* Class 1 TIN */
+enum {
+    TIN1_PRIV = 1,
+    TIN1_MPR  = 2,
+    TIN1_MPW  = 3,
+    TIN1_MPX  = 4,
+    TIN1_MPP  = 5,
+    TIN1_MPN  = 6,
+    TIN1_GRWP = 7,
+};
+
+/* Class 2 TIN */
+enum {
+    TIN2_IOPC = 1,
+    TIN2_UOPC = 2,
+    TIN2_OPD  = 3,
+    TIN2_ALN  = 4,
+    TIN2_MEM  = 5,
+};
+
+/* Class 3 TIN */
+enum {
+    TIN3_FCD  = 1,
+    TIN3_CDO  = 2,
+    TIN3_CDU  = 3,
+    TIN3_FCU  = 4,
+    TIN3_CSU  = 5,
+    TIN3_CTYP = 6,
+    TIN3_NEST = 7,
+};
+
+/* Class 4 TIN */
+enum {
+    TIN4_PSE = 1,
+    TIN4_DSE = 2,
+    TIN4_DAE = 3,
+    TIN4_CAE = 4,
+    TIN4_PIE = 5,
+    TIN4_DIE = 6,
+};
+
+/* Class 5 TIN */
+enum {
+    TIN5_OVF  = 1,
+    TIN5_SOVF = 1,
+};
+
+/* Class 6 TIN
+ *
+ * Is always TIN6_SYS
+ */
+
+/* Class 7 TIN */
+enum {
+    TIN7_NMI = 0,
+};
+
+#include "cpu-qom.h"
+
+#define MMU_USER_IDX 2
+
+void tricore_cpu_list(FILE *f, fprintf_function cpu_fprintf);
+
+#define cpu_exec cpu_tricore_exec
+#define cpu_signal_handler cpu_tricore_signal_handler
+#define cpu_list tricore_cpu_list
+
+static inline int cpu_mmu_index(CPUTRICOREState *env)
+{
+    return 0;
+}
+
+
+
+#include "exec/cpu-all.h"
+
+enum {
+    /* 1 bit to define user level / supervisor access */
+    ACCESS_USER  = 0x00,
+    ACCESS_SUPER = 0x01,
+    /* 1 bit to indicate direction */
+    ACCESS_STORE = 0x02,
+    /* Type of instruction that generated the access */
+    ACCESS_CODE  = 0x10, /* Code fetch access                */
+    ACCESS_INT   = 0x20, /* Integer load/store access        */
+    ACCESS_FLOAT = 0x30, /* floating point load/store access */
+};
+
+void cpu_state_reset(CPUTRICOREState *s);
+int cpu_tricore_exec(CPUTRICOREState *s);
+void tricore_tcg_init(void);
+int cpu_tricore_signal_handler(int host_signum, void *pinfo, void *puc);
+
+static inline void cpu_get_tb_cpu_state(CPUTRICOREState *env, target_ulong *pc,
+                                        target_ulong *cs_base, int *flags)
+{
+    *pc = env->active_tc.PC;
+    *cs_base = 0;
+    *flags = 0;
+}
+
+TRICORECPU *cpu_tricore_init(const char *cpu_model);
+
+static inline CPUTRICOREState *cpu_init(const char *cpu_model)
+{
+    TRICORECPU *cpu = cpu_tricore_init(cpu_model);
+    if (cpu == NULL) {
+        return NULL;
+    }
+    return &cpu->env;
+
+}
+
+
+/* helpers.c */
+int cpu_tricore_handle_mmu_fault(CPUState *cpu, target_ulong address,
+                                 int rw, int mmu_idx);
+#define cpu_handle_mmu_fault cpu_tricore_handle_mmu_fault
+
+#include "exec/exec-all.h"
+
+static inline void cpu_pc_from_tb(CPUTRICOREState *env, TranslationBlock *tb)
+{
+    env->active_tc.PC = tb->pc;
+}
+
+void do_interrupt(CPUTRICOREState *env);
+
+#endif /*__TRICORE_CPU_H__ */
diff --git a/target-tricore/helper.c b/target-tricore/helper.c
new file mode 100644
index 0000000..f8d586a
--- /dev/null
+++ b/target-tricore/helper.c
@@ -0,0 +1,36 @@ 
+/*
+ *  Copyright (c) 2012-2013 Bastian Koppelmann C-Lab/University Paderborn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <signal.h>
+
+#include "cpu.h"
+
+int cpu_tricore_handle_mmu_fault(CPUState *cs, target_ulong address,
+                                 int rw, int mmu_idx)
+{
+    return 0;
+}
+
+void tricore_cpu_do_interrupt(CPUState *cs)
+{
+}
+
diff --git a/target-tricore/helper.h b/target-tricore/helper.h
new file mode 100644
index 0000000..e69de29
diff --git a/target-tricore/machine.c b/target-tricore/machine.c
new file mode 100644
index 0000000..48e706a
--- /dev/null
+++ b/target-tricore/machine.c
@@ -0,0 +1,21 @@ 
+/*
+ *  Copyright (c) 2012-2014 Bastian Koppelmann C-Lab/University Paderborn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "hw/hw.h"
+#include "hw/boards.h"
+
+#include "cpu.h"
diff --git a/target-tricore/op_helper.c b/target-tricore/op_helper.c
new file mode 100644
index 0000000..275790b
--- /dev/null
+++ b/target-tricore/op_helper.c
@@ -0,0 +1,27 @@ 
+/*
+ *  Copyright (c) 2012-2014 Bastian Koppelmann C-Lab/University Paderborn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+#include <stdlib.h>
+#include "cpu.h"
+#include "qemu/host-utils.h"
+#include "exec/helper-proto.h"
+#include "exec/cpu_ldst.h"
+
+void tlb_fill(CPUState *cs, target_ulong addr, int is_write, int mmu_idx,
+              uintptr_t retaddr)
+{
+}
+
diff --git a/target-tricore/translate.c b/target-tricore/translate.c
new file mode 100644
index 0000000..f92f654
--- /dev/null
+++ b/target-tricore/translate.c
@@ -0,0 +1,108 @@ 
+/*
+ *  TRICORE emulation for qemu: main translation routines.
+ *
+ *  Copyright (c) 2013-2014 Bastian Koppelmann C-Lab/University Paderborn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "cpu.h"
+#include "disas/disas.h"
+#include "tcg-op.h"
+#include "exec/cpu_ldst.h"
+
+#include "exec/helper-proto.h"
+#include "exec/helper-gen.h"
+
+
+static const char *regnames_a[] = {
+      "a0"  , "a1"  , "a2"  , "a3" , "a4"  , "a5" ,
+      "a6"  , "a7"  , "a8"  , "a9" , "sp" , "a11" ,
+      "a12" , "a13" , "a14" , "a15",
+    };
+
+static const char *regnames_d[] = {
+      "d0"  , "d1"  , "d2"  , "d3" , "d4"  , "d5"  ,
+      "d6"  , "d7"  , "d8"  , "d9" , "d10" , "d11" ,
+      "d12" , "d13" , "d14" , "d15",
+    };
+
+void tricore_cpu_dump_state(CPUState *cs, FILE *f,
+                            fprintf_function cpu_fprintf, int flags)
+{
+    TRICORECPU *cpu = TRICORE_CPU(cs);
+    CPUTRICOREState *env = &cpu->env;
+    int i;
+
+    cpu_fprintf(f, "PC=%08x\n", env->active_tc.PC);
+    for (i = 0; i < 16; ++i) {
+        if ((i & 3) == 0) {
+            cpu_fprintf(f, "GPR A%02d:", i);
+        }
+        cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames_a[i],
+                    env->active_tc.gpr_a[i]);
+    }
+    for (i = 0; i < 16; ++i) {
+        if ((i & 3) == 0) {
+            cpu_fprintf(f, "GPR D%02d:", i);
+        }
+        cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames_d[i],
+                    env->active_tc.gpr_d[i]);
+    }
+
+}
+
+static inline void
+gen_intermediate_code_internal(TRICORECPU *cpu, struct TranslationBlock *tb,
+                              int search_pc)
+{
+}
+
+void
+gen_intermediate_code(CPUTRICOREState *env, struct TranslationBlock *tb)
+{
+    gen_intermediate_code_internal(tricore_env_get_cpu(env), tb, false);
+}
+
+void
+gen_intermediate_code_pc(CPUTRICOREState *env, struct TranslationBlock *tb)
+{
+    gen_intermediate_code_internal(tricore_env_get_cpu(env), tb, true);
+}
+
+void
+restore_state_to_opc(CPUTRICOREState *env, TranslationBlock *tb, int pc_pos)
+{
+    env->active_tc.PC = tcg_ctx.gen_opc_pc[pc_pos];
+}
+/*
+ *
+ * Initialization
+ *
+ */
+#include "translate_init.c"
+
+void cpu_state_reset(CPUTRICOREState *env)
+{
+}
+
+void tricore_tcg_init(void)
+{
+}
+
+TRICORECPU *cpu_tricore_init(const char *cpu_model)
+{
+    return NULL;
+}
diff --git a/target-tricore/translate_init.c b/target-tricore/translate_init.c
new file mode 100644
index 0000000..d37d2ba
--- /dev/null
+++ b/target-tricore/translate_init.c
@@ -0,0 +1,21 @@ 
+/*
+ *
+ *  Copyright (c) 2012-2014 Bastian Koppelmann C-Lab/University Paderborn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+void tricore_cpu_list(FILE *f, fprintf_function cpu_fprintf)
+{
+}
diff --git a/target-tricore/tricore-defs.h b/target-tricore/tricore-defs.h
new file mode 100644
index 0000000..4350b03
--- /dev/null
+++ b/target-tricore/tricore-defs.h
@@ -0,0 +1,28 @@ 
+/*
+ *  Copyright (c) 2012-2014 Bastian Koppelmann C-Lab/University Paderborn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#if !defined(__QEMU_TRICORE_DEFS_H__)
+#define __QEMU_TRICORE_DEFS_H__
+
+#define TARGET_PAGE_BITS 14
+#define TARGET_LONG_BITS 32
+#define TARGET_PHYS_ADDR_SPACE_BITS 32
+#define TARGET_VIRT_ADDR_SPACE_BITS 32
+
+#define TRICORE_TLB_MAX 128
+
+#endif /* __QEMU_TRICORE_DEFS_H__ */
diff --git a/user-exec.c b/user-exec.c
index 1ff8673..beba4d5 100644
--- a/user-exec.c
+++ b/user-exec.c
@@ -614,6 +614,23 @@  int cpu_signal_handler(int host_signum, void *pinfo,
                              is_write, &uc->uc_sigmask, puc);
 }
 
+#elif defined(__tricore__)
+
+int cpu_signal_handler(int host_signum, void *pinfo,
+                       void *puc)
+{
+    printf("cpu_signal_handler\n");
+  /*  siginfo_t *info = pinfo;
+    struct ucontext *uc = puc;
+    greg_t pc = uc->uc_mcontext.pc;
+    int is_write;
+    is_write = 0;
+    return handle_cpu_signal(pc, (unsigned long)info->si_addr,
+                             is_write, &uc->uc_sigmask, puc);*/
+    return 0;
+}
+
+
 #elif defined(__hppa__)
 
 int cpu_signal_handler(int host_signum, void *pinfo,