diff mbox series

[for,2.13,5/5] linux-user: cleanup main()

Message ID 20180322215833.7713-6-laurent@vivier.eu
State New
Headers show
Series linux-user: move arch specific parts to arch directories | expand

Commit Message

Laurent Vivier March 22, 2018, 9:58 p.m. UTC
move all prologue specific parts to
prologue.inc.c in arch directory

Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
 linux-user/aarch64/prologue.inc.c    |  21 ++
 linux-user/alpha/prologue.inc.c      |   9 +
 linux-user/arm/prologue.inc.c        |  23 ++
 linux-user/cris/prologue.inc.c       |  19 ++
 linux-user/hppa/prologue.inc.c       |   8 +
 linux-user/i386/prologue.inc.c       | 113 ++++++++++
 linux-user/m68k/prologue.inc.c       |  26 +++
 linux-user/main.c                    | 400 +----------------------------------
 linux-user/microblaze/prologue.inc.c |  35 +++
 linux-user/mips/prologue.inc.c       |  25 +++
 linux-user/mips64/prologue.inc.c     |   1 +
 linux-user/nios2/prologue.inc.c      |  29 +++
 linux-user/openrisc/prologue.inc.c   |   9 +
 linux-user/ppc/prologue.inc.c        |  16 ++
 linux-user/riscv/prologue.inc.c      |   4 +
 linux-user/s390x/prologue.inc.c      |   8 +
 linux-user/sh4/prologue.inc.c        |   8 +
 linux-user/sparc/prologue.inc.c      |  10 +
 linux-user/sparc64/prologue.inc.c    |   1 +
 linux-user/tilegx/prologue.inc.c     |  10 +
 linux-user/x86_64/prologue.inc.c     |   1 +
 linux-user/xtensa/prologue.inc.c     |   8 +
 22 files changed, 385 insertions(+), 399 deletions(-)
 create mode 100644 linux-user/aarch64/prologue.inc.c
 create mode 100644 linux-user/alpha/prologue.inc.c
 create mode 100644 linux-user/arm/prologue.inc.c
 create mode 100644 linux-user/cris/prologue.inc.c
 create mode 100644 linux-user/hppa/prologue.inc.c
 create mode 100644 linux-user/i386/prologue.inc.c
 create mode 100644 linux-user/m68k/prologue.inc.c
 create mode 100644 linux-user/microblaze/prologue.inc.c
 create mode 100644 linux-user/mips/prologue.inc.c
 create mode 100644 linux-user/mips64/prologue.inc.c
 create mode 100644 linux-user/nios2/prologue.inc.c
 create mode 100644 linux-user/openrisc/prologue.inc.c
 create mode 100644 linux-user/ppc/prologue.inc.c
 create mode 100644 linux-user/riscv/prologue.inc.c
 create mode 100644 linux-user/s390x/prologue.inc.c
 create mode 100644 linux-user/sh4/prologue.inc.c
 create mode 100644 linux-user/sparc/prologue.inc.c
 create mode 100644 linux-user/sparc64/prologue.inc.c
 create mode 100644 linux-user/tilegx/prologue.inc.c
 create mode 100644 linux-user/x86_64/prologue.inc.c
 create mode 100644 linux-user/xtensa/prologue.inc.c

Comments

Philippe Mathieu-Daudé March 23, 2018, 2:18 a.m. UTC | #1
On 03/22/2018 06:58 PM, Laurent Vivier wrote:
> move all prologue specific parts to
> prologue.inc.c in arch directory
> 
> Signed-off-by: Laurent Vivier <laurent@vivier.eu>

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> ---
>  linux-user/aarch64/prologue.inc.c    |  21 ++
>  linux-user/alpha/prologue.inc.c      |   9 +
>  linux-user/arm/prologue.inc.c        |  23 ++
>  linux-user/cris/prologue.inc.c       |  19 ++
>  linux-user/hppa/prologue.inc.c       |   8 +
>  linux-user/i386/prologue.inc.c       | 113 ++++++++++
>  linux-user/m68k/prologue.inc.c       |  26 +++
>  linux-user/main.c                    | 400 +----------------------------------
>  linux-user/microblaze/prologue.inc.c |  35 +++
>  linux-user/mips/prologue.inc.c       |  25 +++
>  linux-user/mips64/prologue.inc.c     |   1 +
>  linux-user/nios2/prologue.inc.c      |  29 +++
>  linux-user/openrisc/prologue.inc.c   |   9 +
>  linux-user/ppc/prologue.inc.c        |  16 ++
>  linux-user/riscv/prologue.inc.c      |   4 +
>  linux-user/s390x/prologue.inc.c      |   8 +
>  linux-user/sh4/prologue.inc.c        |   8 +
>  linux-user/sparc/prologue.inc.c      |  10 +
>  linux-user/sparc64/prologue.inc.c    |   1 +
>  linux-user/tilegx/prologue.inc.c     |  10 +
>  linux-user/x86_64/prologue.inc.c     |   1 +
>  linux-user/xtensa/prologue.inc.c     |   8 +
>  22 files changed, 385 insertions(+), 399 deletions(-)
>  create mode 100644 linux-user/aarch64/prologue.inc.c
>  create mode 100644 linux-user/alpha/prologue.inc.c
>  create mode 100644 linux-user/arm/prologue.inc.c
>  create mode 100644 linux-user/cris/prologue.inc.c
>  create mode 100644 linux-user/hppa/prologue.inc.c
>  create mode 100644 linux-user/i386/prologue.inc.c
>  create mode 100644 linux-user/m68k/prologue.inc.c
>  create mode 100644 linux-user/microblaze/prologue.inc.c
>  create mode 100644 linux-user/mips/prologue.inc.c
>  create mode 100644 linux-user/mips64/prologue.inc.c
>  create mode 100644 linux-user/nios2/prologue.inc.c
>  create mode 100644 linux-user/openrisc/prologue.inc.c
>  create mode 100644 linux-user/ppc/prologue.inc.c
>  create mode 100644 linux-user/riscv/prologue.inc.c
>  create mode 100644 linux-user/s390x/prologue.inc.c
>  create mode 100644 linux-user/sh4/prologue.inc.c
>  create mode 100644 linux-user/sparc/prologue.inc.c
>  create mode 100644 linux-user/sparc64/prologue.inc.c
>  create mode 100644 linux-user/tilegx/prologue.inc.c
>  create mode 100644 linux-user/x86_64/prologue.inc.c
>  create mode 100644 linux-user/xtensa/prologue.inc.c
> 
> diff --git a/linux-user/aarch64/prologue.inc.c b/linux-user/aarch64/prologue.inc.c
> new file mode 100644
> index 0000000000..5ffb50ae84
> --- /dev/null
> +++ b/linux-user/aarch64/prologue.inc.c
> @@ -0,0 +1,21 @@
> +    {
> +        int i;
> +
> +        if (!(arm_feature(env, ARM_FEATURE_AARCH64))) {
> +            fprintf(stderr,
> +                    "The selected ARM CPU does not support 64 bit mode\n");
> +            exit(EXIT_FAILURE);
> +        }
> +
> +        for (i = 0; i < 31; i++) {
> +            env->xregs[i] = regs->regs[i];
> +        }
> +        env->pc = regs->pc;
> +        env->xregs[31] = regs->sp;
> +#ifdef TARGET_WORDS_BIGENDIAN
> +        env->cp15.sctlr_el[1] |= SCTLR_E0E;
> +        for (i = 1; i < 4; ++i) {
> +            env->cp15.sctlr_el[i] |= SCTLR_EE;
> +        }
> +#endif
> +    }
> diff --git a/linux-user/alpha/prologue.inc.c b/linux-user/alpha/prologue.inc.c
> new file mode 100644
> index 0000000000..e7a34c38cd
> --- /dev/null
> +++ b/linux-user/alpha/prologue.inc.c
> @@ -0,0 +1,9 @@
> +    {
> +        int i;
> +
> +        for(i = 0; i < 28; i++) {
> +            env->ir[i] = ((abi_ulong *)regs)[i];
> +        }
> +        env->ir[IR_SP] = regs->usp;
> +        env->pc = regs->pc;
> +    }
> diff --git a/linux-user/arm/prologue.inc.c b/linux-user/arm/prologue.inc.c
> new file mode 100644
> index 0000000000..712f34fb4d
> --- /dev/null
> +++ b/linux-user/arm/prologue.inc.c
> @@ -0,0 +1,23 @@
> +    {
> +        int i;
> +        cpsr_write(env, regs->uregs[16], CPSR_USER | CPSR_EXEC,
> +                   CPSRWriteByInstr);
> +        for(i = 0; i < 16; i++) {
> +            env->regs[i] = regs->uregs[i];
> +        }
> +#ifdef TARGET_WORDS_BIGENDIAN
> +        /* Enable BE8.  */
> +        if (EF_ARM_EABI_VERSION(info->elf_flags) >= EF_ARM_EABI_VER4
> +            && (info->elf_flags & EF_ARM_BE8)) {
> +            env->uncached_cpsr |= CPSR_E;
> +            env->cp15.sctlr_el[1] |= SCTLR_E0E;
> +        } else {
> +            env->cp15.sctlr_el[1] |= SCTLR_B;
> +        }
> +#endif
> +    }
> +
> +    ts->stack_base = info->start_stack;
> +    ts->heap_base = info->brk;
> +    /* This will be filled in on the first SYS_HEAPINFO call.  */
> +    ts->heap_limit = 0;
> diff --git a/linux-user/cris/prologue.inc.c b/linux-user/cris/prologue.inc.c
> new file mode 100644
> index 0000000000..9bc35d0825
> --- /dev/null
> +++ b/linux-user/cris/prologue.inc.c
> @@ -0,0 +1,19 @@
> +    {
> +	    env->regs[0] = regs->r0;
> +	    env->regs[1] = regs->r1;
> +	    env->regs[2] = regs->r2;
> +	    env->regs[3] = regs->r3;
> +	    env->regs[4] = regs->r4;
> +	    env->regs[5] = regs->r5;
> +	    env->regs[6] = regs->r6;
> +	    env->regs[7] = regs->r7;
> +	    env->regs[8] = regs->r8;
> +	    env->regs[9] = regs->r9;
> +	    env->regs[10] = regs->r10;
> +	    env->regs[11] = regs->r11;
> +	    env->regs[12] = regs->r12;
> +	    env->regs[13] = regs->r13;
> +	    env->regs[14] = info->start_stack;
> +	    env->regs[15] = regs->acr;
> +	    env->pc = regs->erp;
> +    }
> diff --git a/linux-user/hppa/prologue.inc.c b/linux-user/hppa/prologue.inc.c
> new file mode 100644
> index 0000000000..922de62eac
> --- /dev/null
> +++ b/linux-user/hppa/prologue.inc.c
> @@ -0,0 +1,8 @@
> +    {
> +        int i;
> +        for (i = 1; i < 32; i++) {
> +            env->gr[i] = regs->gr[i];
> +        }
> +        env->iaoq_f = regs->iaoq[0];
> +        env->iaoq_b = regs->iaoq[1];
> +    }
> diff --git a/linux-user/i386/prologue.inc.c b/linux-user/i386/prologue.inc.c
> new file mode 100644
> index 0000000000..3a40a0a2e8
> --- /dev/null
> +++ b/linux-user/i386/prologue.inc.c
> @@ -0,0 +1,113 @@
> +    env->cr[0] = CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK;
> +    env->hflags |= HF_PE_MASK | HF_CPL_MASK;
> +    if (env->features[FEAT_1_EDX] & CPUID_SSE) {
> +        env->cr[4] |= CR4_OSFXSR_MASK;
> +        env->hflags |= HF_OSFXSR_MASK;
> +    }
> +#ifndef TARGET_ABI32
> +    /* enable 64 bit mode if possible */
> +    if (!(env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM)) {
> +        fprintf(stderr, "The selected x86 CPU does not support 64 bit mode\n");
> +        exit(EXIT_FAILURE);
> +    }
> +    env->cr[4] |= CR4_PAE_MASK;
> +    env->efer |= MSR_EFER_LMA | MSR_EFER_LME;
> +    env->hflags |= HF_LMA_MASK;
> +#endif
> +
> +    /* flags setup : we activate the IRQs by default as in user mode */
> +    env->eflags |= IF_MASK;
> +
> +    /* linux register setup */
> +#ifndef TARGET_ABI32
> +    env->regs[R_EAX] = regs->rax;
> +    env->regs[R_EBX] = regs->rbx;
> +    env->regs[R_ECX] = regs->rcx;
> +    env->regs[R_EDX] = regs->rdx;
> +    env->regs[R_ESI] = regs->rsi;
> +    env->regs[R_EDI] = regs->rdi;
> +    env->regs[R_EBP] = regs->rbp;
> +    env->regs[R_ESP] = regs->rsp;
> +    env->eip = regs->rip;
> +#else
> +    env->regs[R_EAX] = regs->eax;
> +    env->regs[R_EBX] = regs->ebx;
> +    env->regs[R_ECX] = regs->ecx;
> +    env->regs[R_EDX] = regs->edx;
> +    env->regs[R_ESI] = regs->esi;
> +    env->regs[R_EDI] = regs->edi;
> +    env->regs[R_EBP] = regs->ebp;
> +    env->regs[R_ESP] = regs->esp;
> +    env->eip = regs->eip;
> +#endif
> +
> +    /* linux interrupt setup */
> +#ifndef TARGET_ABI32
> +    env->idt.limit = 511;
> +#else
> +    env->idt.limit = 255;
> +#endif
> +    env->idt.base = target_mmap(0, sizeof(uint64_t) * (env->idt.limit + 1),
> +                                PROT_READ|PROT_WRITE,
> +                                MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
> +    idt_table = g2h(env->idt.base);
> +    set_idt(0, 0);
> +    set_idt(1, 0);
> +    set_idt(2, 0);
> +    set_idt(3, 3);
> +    set_idt(4, 3);
> +    set_idt(5, 0);
> +    set_idt(6, 0);
> +    set_idt(7, 0);
> +    set_idt(8, 0);
> +    set_idt(9, 0);
> +    set_idt(10, 0);
> +    set_idt(11, 0);
> +    set_idt(12, 0);
> +    set_idt(13, 0);
> +    set_idt(14, 0);
> +    set_idt(15, 0);
> +    set_idt(16, 0);
> +    set_idt(17, 0);
> +    set_idt(18, 0);
> +    set_idt(19, 0);
> +    set_idt(0x80, 3);
> +
> +    /* linux segment setup */
> +    {
> +        uint64_t *gdt_table;
> +        env->gdt.base = target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES,
> +                                    PROT_READ|PROT_WRITE,
> +                                    MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
> +        env->gdt.limit = sizeof(uint64_t) * TARGET_GDT_ENTRIES - 1;
> +        gdt_table = g2h(env->gdt.base);
> +#ifdef TARGET_ABI32
> +        write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
> +                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
> +                 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
> +#else
> +        /* 64 bit code segment */
> +        write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
> +                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
> +                 DESC_L_MASK |
> +                 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
> +#endif
> +        write_dt(&gdt_table[__USER_DS >> 3], 0, 0xfffff,
> +                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
> +                 (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT));
> +    }
> +    cpu_x86_load_seg(env, R_CS, __USER_CS);
> +    cpu_x86_load_seg(env, R_SS, __USER_DS);
> +#ifdef TARGET_ABI32
> +    cpu_x86_load_seg(env, R_DS, __USER_DS);
> +    cpu_x86_load_seg(env, R_ES, __USER_DS);
> +    cpu_x86_load_seg(env, R_FS, __USER_DS);
> +    cpu_x86_load_seg(env, R_GS, __USER_DS);
> +    /* This hack makes Wine work... */
> +    env->segs[R_FS].selector = 0;
> +#else
> +    cpu_x86_load_seg(env, R_DS, 0);
> +    cpu_x86_load_seg(env, R_ES, 0);
> +    cpu_x86_load_seg(env, R_FS, 0);
> +    cpu_x86_load_seg(env, R_GS, 0);
> +#endif
> diff --git a/linux-user/m68k/prologue.inc.c b/linux-user/m68k/prologue.inc.c
> new file mode 100644
> index 0000000000..b9bd66cd7a
> --- /dev/null
> +++ b/linux-user/m68k/prologue.inc.c
> @@ -0,0 +1,26 @@
> +    {
> +        env->pc = regs->pc;
> +        env->dregs[0] = regs->d0;
> +        env->dregs[1] = regs->d1;
> +        env->dregs[2] = regs->d2;
> +        env->dregs[3] = regs->d3;
> +        env->dregs[4] = regs->d4;
> +        env->dregs[5] = regs->d5;
> +        env->dregs[6] = regs->d6;
> +        env->dregs[7] = regs->d7;
> +        env->aregs[0] = regs->a0;
> +        env->aregs[1] = regs->a1;
> +        env->aregs[2] = regs->a2;
> +        env->aregs[3] = regs->a3;
> +        env->aregs[4] = regs->a4;
> +        env->aregs[5] = regs->a5;
> +        env->aregs[6] = regs->a6;
> +        env->aregs[7] = regs->usp;
> +        env->sr = regs->sr;
> +        ts->sim_syscalls = 1;
> +    }
> +
> +    ts->stack_base = info->start_stack;
> +    ts->heap_base = info->brk;
> +    /* This will be filled in on the first SYS_HEAPINFO call.  */
> +    ts->heap_limit = 0;
> diff --git a/linux-user/main.c b/linux-user/main.c
> index fd71113855..c2a5813694 100644
> --- a/linux-user/main.c
> +++ b/linux-user/main.c
> @@ -817,405 +817,7 @@ int main(int argc, char **argv, char **envp)
>      tcg_prologue_init(tcg_ctx);
>      tcg_region_init();
>  
> -#if defined(TARGET_I386)
> -    env->cr[0] = CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK;
> -    env->hflags |= HF_PE_MASK | HF_CPL_MASK;
> -    if (env->features[FEAT_1_EDX] & CPUID_SSE) {
> -        env->cr[4] |= CR4_OSFXSR_MASK;
> -        env->hflags |= HF_OSFXSR_MASK;
> -    }
> -#ifndef TARGET_ABI32
> -    /* enable 64 bit mode if possible */
> -    if (!(env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM)) {
> -        fprintf(stderr, "The selected x86 CPU does not support 64 bit mode\n");
> -        exit(EXIT_FAILURE);
> -    }
> -    env->cr[4] |= CR4_PAE_MASK;
> -    env->efer |= MSR_EFER_LMA | MSR_EFER_LME;
> -    env->hflags |= HF_LMA_MASK;
> -#endif
> -
> -    /* flags setup : we activate the IRQs by default as in user mode */
> -    env->eflags |= IF_MASK;
> -
> -    /* linux register setup */
> -#ifndef TARGET_ABI32
> -    env->regs[R_EAX] = regs->rax;
> -    env->regs[R_EBX] = regs->rbx;
> -    env->regs[R_ECX] = regs->rcx;
> -    env->regs[R_EDX] = regs->rdx;
> -    env->regs[R_ESI] = regs->rsi;
> -    env->regs[R_EDI] = regs->rdi;
> -    env->regs[R_EBP] = regs->rbp;
> -    env->regs[R_ESP] = regs->rsp;
> -    env->eip = regs->rip;
> -#else
> -    env->regs[R_EAX] = regs->eax;
> -    env->regs[R_EBX] = regs->ebx;
> -    env->regs[R_ECX] = regs->ecx;
> -    env->regs[R_EDX] = regs->edx;
> -    env->regs[R_ESI] = regs->esi;
> -    env->regs[R_EDI] = regs->edi;
> -    env->regs[R_EBP] = regs->ebp;
> -    env->regs[R_ESP] = regs->esp;
> -    env->eip = regs->eip;
> -#endif
> -
> -    /* linux interrupt setup */
> -#ifndef TARGET_ABI32
> -    env->idt.limit = 511;
> -#else
> -    env->idt.limit = 255;
> -#endif
> -    env->idt.base = target_mmap(0, sizeof(uint64_t) * (env->idt.limit + 1),
> -                                PROT_READ|PROT_WRITE,
> -                                MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
> -    idt_table = g2h(env->idt.base);
> -    set_idt(0, 0);
> -    set_idt(1, 0);
> -    set_idt(2, 0);
> -    set_idt(3, 3);
> -    set_idt(4, 3);
> -    set_idt(5, 0);
> -    set_idt(6, 0);
> -    set_idt(7, 0);
> -    set_idt(8, 0);
> -    set_idt(9, 0);
> -    set_idt(10, 0);
> -    set_idt(11, 0);
> -    set_idt(12, 0);
> -    set_idt(13, 0);
> -    set_idt(14, 0);
> -    set_idt(15, 0);
> -    set_idt(16, 0);
> -    set_idt(17, 0);
> -    set_idt(18, 0);
> -    set_idt(19, 0);
> -    set_idt(0x80, 3);
> -
> -    /* linux segment setup */
> -    {
> -        uint64_t *gdt_table;
> -        env->gdt.base = target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES,
> -                                    PROT_READ|PROT_WRITE,
> -                                    MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
> -        env->gdt.limit = sizeof(uint64_t) * TARGET_GDT_ENTRIES - 1;
> -        gdt_table = g2h(env->gdt.base);
> -#ifdef TARGET_ABI32
> -        write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
> -                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
> -                 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
> -#else
> -        /* 64 bit code segment */
> -        write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
> -                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
> -                 DESC_L_MASK |
> -                 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
> -#endif
> -        write_dt(&gdt_table[__USER_DS >> 3], 0, 0xfffff,
> -                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
> -                 (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT));
> -    }
> -    cpu_x86_load_seg(env, R_CS, __USER_CS);
> -    cpu_x86_load_seg(env, R_SS, __USER_DS);
> -#ifdef TARGET_ABI32
> -    cpu_x86_load_seg(env, R_DS, __USER_DS);
> -    cpu_x86_load_seg(env, R_ES, __USER_DS);
> -    cpu_x86_load_seg(env, R_FS, __USER_DS);
> -    cpu_x86_load_seg(env, R_GS, __USER_DS);
> -    /* This hack makes Wine work... */
> -    env->segs[R_FS].selector = 0;
> -#else
> -    cpu_x86_load_seg(env, R_DS, 0);
> -    cpu_x86_load_seg(env, R_ES, 0);
> -    cpu_x86_load_seg(env, R_FS, 0);
> -    cpu_x86_load_seg(env, R_GS, 0);
> -#endif
> -#elif defined(TARGET_AARCH64)
> -    {
> -        int i;
> -
> -        if (!(arm_feature(env, ARM_FEATURE_AARCH64))) {
> -            fprintf(stderr,
> -                    "The selected ARM CPU does not support 64 bit mode\n");
> -            exit(EXIT_FAILURE);
> -        }
> -
> -        for (i = 0; i < 31; i++) {
> -            env->xregs[i] = regs->regs[i];
> -        }
> -        env->pc = regs->pc;
> -        env->xregs[31] = regs->sp;
> -#ifdef TARGET_WORDS_BIGENDIAN
> -        env->cp15.sctlr_el[1] |= SCTLR_E0E;
> -        for (i = 1; i < 4; ++i) {
> -            env->cp15.sctlr_el[i] |= SCTLR_EE;
> -        }
> -#endif
> -    }
> -#elif defined(TARGET_ARM)
> -    {
> -        int i;
> -        cpsr_write(env, regs->uregs[16], CPSR_USER | CPSR_EXEC,
> -                   CPSRWriteByInstr);
> -        for(i = 0; i < 16; i++) {
> -            env->regs[i] = regs->uregs[i];
> -        }
> -#ifdef TARGET_WORDS_BIGENDIAN
> -        /* Enable BE8.  */
> -        if (EF_ARM_EABI_VERSION(info->elf_flags) >= EF_ARM_EABI_VER4
> -            && (info->elf_flags & EF_ARM_BE8)) {
> -            env->uncached_cpsr |= CPSR_E;
> -            env->cp15.sctlr_el[1] |= SCTLR_E0E;
> -        } else {
> -            env->cp15.sctlr_el[1] |= SCTLR_B;
> -        }
> -#endif
> -    }
> -#elif defined(TARGET_SPARC)
> -    {
> -        int i;
> -	env->pc = regs->pc;
> -	env->npc = regs->npc;
> -        env->y = regs->y;
> -        for(i = 0; i < 8; i++)
> -            env->gregs[i] = regs->u_regs[i];
> -        for(i = 0; i < 8; i++)
> -            env->regwptr[i] = regs->u_regs[i + 8];
> -    }
> -#elif defined(TARGET_PPC)
> -    {
> -        int i;
> -
> -#if defined(TARGET_PPC64)
> -        int flag = (env->insns_flags2 & PPC2_BOOKE206) ? MSR_CM : MSR_SF;
> -#if defined(TARGET_ABI32)
> -        env->msr &= ~((target_ulong)1 << flag);
> -#else
> -        env->msr |= (target_ulong)1 << flag;
> -#endif
> -#endif
> -        env->nip = regs->nip;
> -        for(i = 0; i < 32; i++) {
> -            env->gpr[i] = regs->gpr[i];
> -        }
> -    }
> -#elif defined(TARGET_M68K)
> -    {
> -        env->pc = regs->pc;
> -        env->dregs[0] = regs->d0;
> -        env->dregs[1] = regs->d1;
> -        env->dregs[2] = regs->d2;
> -        env->dregs[3] = regs->d3;
> -        env->dregs[4] = regs->d4;
> -        env->dregs[5] = regs->d5;
> -        env->dregs[6] = regs->d6;
> -        env->dregs[7] = regs->d7;
> -        env->aregs[0] = regs->a0;
> -        env->aregs[1] = regs->a1;
> -        env->aregs[2] = regs->a2;
> -        env->aregs[3] = regs->a3;
> -        env->aregs[4] = regs->a4;
> -        env->aregs[5] = regs->a5;
> -        env->aregs[6] = regs->a6;
> -        env->aregs[7] = regs->usp;
> -        env->sr = regs->sr;
> -        ts->sim_syscalls = 1;
> -    }
> -#elif defined(TARGET_MICROBLAZE)
> -    {
> -        env->regs[0] = regs->r0;
> -        env->regs[1] = regs->r1;
> -        env->regs[2] = regs->r2;
> -        env->regs[3] = regs->r3;
> -        env->regs[4] = regs->r4;
> -        env->regs[5] = regs->r5;
> -        env->regs[6] = regs->r6;
> -        env->regs[7] = regs->r7;
> -        env->regs[8] = regs->r8;
> -        env->regs[9] = regs->r9;
> -        env->regs[10] = regs->r10;
> -        env->regs[11] = regs->r11;
> -        env->regs[12] = regs->r12;
> -        env->regs[13] = regs->r13;
> -        env->regs[14] = regs->r14;
> -        env->regs[15] = regs->r15;	    
> -        env->regs[16] = regs->r16;	    
> -        env->regs[17] = regs->r17;	    
> -        env->regs[18] = regs->r18;	    
> -        env->regs[19] = regs->r19;	    
> -        env->regs[20] = regs->r20;	    
> -        env->regs[21] = regs->r21;	    
> -        env->regs[22] = regs->r22;	    
> -        env->regs[23] = regs->r23;	    
> -        env->regs[24] = regs->r24;	    
> -        env->regs[25] = regs->r25;	    
> -        env->regs[26] = regs->r26;	    
> -        env->regs[27] = regs->r27;	    
> -        env->regs[28] = regs->r28;	    
> -        env->regs[29] = regs->r29;	    
> -        env->regs[30] = regs->r30;	    
> -        env->regs[31] = regs->r31;	    
> -        env->sregs[SR_PC] = regs->pc;
> -    }
> -#elif defined(TARGET_MIPS)
> -    {
> -        int i;
> -
> -        for(i = 0; i < 32; i++) {
> -            env->active_tc.gpr[i] = regs->regs[i];
> -        }
> -        env->active_tc.PC = regs->cp0_epc & ~(target_ulong)1;
> -        if (regs->cp0_epc & 1) {
> -            env->hflags |= MIPS_HFLAG_M16;
> -        }
> -        if (((info->elf_flags & EF_MIPS_NAN2008) != 0) !=
> -            ((env->active_fpu.fcr31 & (1 << FCR31_NAN2008)) != 0)) {
> -            if ((env->active_fpu.fcr31_rw_bitmask &
> -                  (1 << FCR31_NAN2008)) == 0) {
> -                fprintf(stderr, "ELF binary's NaN mode not supported by CPU\n");
> -                exit(1);
> -            }
> -            if ((info->elf_flags & EF_MIPS_NAN2008) != 0) {
> -                env->active_fpu.fcr31 |= (1 << FCR31_NAN2008);
> -            } else {
> -                env->active_fpu.fcr31 &= ~(1 << FCR31_NAN2008);
> -            }
> -            restore_snan_bit_mode(env);
> -        }
> -    }
> -#elif defined(TARGET_NIOS2)
> -    {
> -        env->regs[0] = 0;
> -        env->regs[1] = regs->r1;
> -        env->regs[2] = regs->r2;
> -        env->regs[3] = regs->r3;
> -        env->regs[4] = regs->r4;
> -        env->regs[5] = regs->r5;
> -        env->regs[6] = regs->r6;
> -        env->regs[7] = regs->r7;
> -        env->regs[8] = regs->r8;
> -        env->regs[9] = regs->r9;
> -        env->regs[10] = regs->r10;
> -        env->regs[11] = regs->r11;
> -        env->regs[12] = regs->r12;
> -        env->regs[13] = regs->r13;
> -        env->regs[14] = regs->r14;
> -        env->regs[15] = regs->r15;
> -        /* TODO: unsigned long  orig_r2; */
> -        env->regs[R_RA] = regs->ra;
> -        env->regs[R_FP] = regs->fp;
> -        env->regs[R_SP] = regs->sp;
> -        env->regs[R_GP] = regs->gp;
> -        env->regs[CR_ESTATUS] = regs->estatus;
> -        env->regs[R_EA] = regs->ea;
> -        /* TODO: unsigned long  orig_r7; */
> -
> -        /* Emulate eret when starting thread. */
> -        env->regs[R_PC] = regs->ea;
> -    }
> -#elif defined(TARGET_OPENRISC)
> -    {
> -        int i;
> -
> -        for (i = 0; i < 32; i++) {
> -            cpu_set_gpr(env, i, regs->gpr[i]);
> -        }
> -        env->pc = regs->pc;
> -        cpu_set_sr(env, regs->sr);
> -    }
> -#elif defined(TARGET_RISCV)
> -    {
> -        env->pc = regs->sepc;
> -        env->gpr[xSP] = regs->sp;
> -    }
> -#elif defined(TARGET_SH4)
> -    {
> -        int i;
> -
> -        for(i = 0; i < 16; i++) {
> -            env->gregs[i] = regs->regs[i];
> -        }
> -        env->pc = regs->pc;
> -    }
> -#elif defined(TARGET_ALPHA)
> -    {
> -        int i;
> -
> -        for(i = 0; i < 28; i++) {
> -            env->ir[i] = ((abi_ulong *)regs)[i];
> -        }
> -        env->ir[IR_SP] = regs->usp;
> -        env->pc = regs->pc;
> -    }
> -#elif defined(TARGET_CRIS)
> -    {
> -	    env->regs[0] = regs->r0;
> -	    env->regs[1] = regs->r1;
> -	    env->regs[2] = regs->r2;
> -	    env->regs[3] = regs->r3;
> -	    env->regs[4] = regs->r4;
> -	    env->regs[5] = regs->r5;
> -	    env->regs[6] = regs->r6;
> -	    env->regs[7] = regs->r7;
> -	    env->regs[8] = regs->r8;
> -	    env->regs[9] = regs->r9;
> -	    env->regs[10] = regs->r10;
> -	    env->regs[11] = regs->r11;
> -	    env->regs[12] = regs->r12;
> -	    env->regs[13] = regs->r13;
> -	    env->regs[14] = info->start_stack;
> -	    env->regs[15] = regs->acr;	    
> -	    env->pc = regs->erp;
> -    }
> -#elif defined(TARGET_S390X)
> -    {
> -            int i;
> -            for (i = 0; i < 16; i++) {
> -                env->regs[i] = regs->gprs[i];
> -            }
> -            env->psw.mask = regs->psw.mask;
> -            env->psw.addr = regs->psw.addr;
> -    }
> -#elif defined(TARGET_TILEGX)
> -    {
> -        int i;
> -        for (i = 0; i < TILEGX_R_COUNT; i++) {
> -            env->regs[i] = regs->regs[i];
> -        }
> -        for (i = 0; i < TILEGX_SPR_COUNT; i++) {
> -            env->spregs[i] = 0;
> -        }
> -        env->pc = regs->pc;
> -    }
> -#elif defined(TARGET_HPPA)
> -    {
> -        int i;
> -        for (i = 1; i < 32; i++) {
> -            env->gr[i] = regs->gr[i];
> -        }
> -        env->iaoq_f = regs->iaoq[0];
> -        env->iaoq_b = regs->iaoq[1];
> -    }
> -#elif defined(TARGET_XTENSA)
> -    {
> -        int i;
> -        for (i = 0; i < 16; ++i) {
> -            env->regs[i] = regs->areg[i];
> -        }
> -        env->sregs[WINDOW_START] = regs->windowstart;
> -        env->pc = regs->pc;
> -    }
> -#else
> -#error unsupported target CPU
> -#endif
> -
> -#if defined(TARGET_ARM) || defined(TARGET_M68K)
> -    ts->stack_base = info->start_stack;
> -    ts->heap_base = info->brk;
> -    /* This will be filled in on the first SYS_HEAPINFO call.  */
> -    ts->heap_limit = 0;
> -#endif
> +#include "prologue.inc.c"
>  
>      if (gdbstub_port) {
>          if (gdbserver_start(gdbstub_port) < 0) {
> diff --git a/linux-user/microblaze/prologue.inc.c b/linux-user/microblaze/prologue.inc.c
> new file mode 100644
> index 0000000000..a7248cb788
> --- /dev/null
> +++ b/linux-user/microblaze/prologue.inc.c
> @@ -0,0 +1,35 @@
> +    {
> +        env->regs[0] = regs->r0;
> +        env->regs[1] = regs->r1;
> +        env->regs[2] = regs->r2;
> +        env->regs[3] = regs->r3;
> +        env->regs[4] = regs->r4;
> +        env->regs[5] = regs->r5;
> +        env->regs[6] = regs->r6;
> +        env->regs[7] = regs->r7;
> +        env->regs[8] = regs->r8;
> +        env->regs[9] = regs->r9;
> +        env->regs[10] = regs->r10;
> +        env->regs[11] = regs->r11;
> +        env->regs[12] = regs->r12;
> +        env->regs[13] = regs->r13;
> +        env->regs[14] = regs->r14;
> +        env->regs[15] = regs->r15;
> +        env->regs[16] = regs->r16;
> +        env->regs[17] = regs->r17;
> +        env->regs[18] = regs->r18;
> +        env->regs[19] = regs->r19;
> +        env->regs[20] = regs->r20;
> +        env->regs[21] = regs->r21;
> +        env->regs[22] = regs->r22;
> +        env->regs[23] = regs->r23;
> +        env->regs[24] = regs->r24;
> +        env->regs[25] = regs->r25;
> +        env->regs[26] = regs->r26;
> +        env->regs[27] = regs->r27;
> +        env->regs[28] = regs->r28;
> +        env->regs[29] = regs->r29;
> +        env->regs[30] = regs->r30;
> +        env->regs[31] = regs->r31;
> +        env->sregs[SR_PC] = regs->pc;
> +    }
> diff --git a/linux-user/mips/prologue.inc.c b/linux-user/mips/prologue.inc.c
> new file mode 100644
> index 0000000000..bd7f2b3c0e
> --- /dev/null
> +++ b/linux-user/mips/prologue.inc.c
> @@ -0,0 +1,25 @@
> +    {
> +        int i;
> +
> +        for(i = 0; i < 32; i++) {
> +            env->active_tc.gpr[i] = regs->regs[i];
> +        }
> +        env->active_tc.PC = regs->cp0_epc & ~(target_ulong)1;
> +        if (regs->cp0_epc & 1) {
> +            env->hflags |= MIPS_HFLAG_M16;
> +        }
> +        if (((info->elf_flags & EF_MIPS_NAN2008) != 0) !=
> +            ((env->active_fpu.fcr31 & (1 << FCR31_NAN2008)) != 0)) {
> +            if ((env->active_fpu.fcr31_rw_bitmask &
> +                  (1 << FCR31_NAN2008)) == 0) {
> +                fprintf(stderr, "ELF binary's NaN mode not supported by CPU\n");
> +                exit(1);
> +            }
> +            if ((info->elf_flags & EF_MIPS_NAN2008) != 0) {
> +                env->active_fpu.fcr31 |= (1 << FCR31_NAN2008);
> +            } else {
> +                env->active_fpu.fcr31 &= ~(1 << FCR31_NAN2008);
> +            }
> +            restore_snan_bit_mode(env);
> +        }
> +    }
> diff --git a/linux-user/mips64/prologue.inc.c b/linux-user/mips64/prologue.inc.c
> new file mode 100644
> index 0000000000..d74fa9e773
> --- /dev/null
> +++ b/linux-user/mips64/prologue.inc.c
> @@ -0,0 +1 @@
> +#include "../mips/prologue.inc.c"
> diff --git a/linux-user/nios2/prologue.inc.c b/linux-user/nios2/prologue.inc.c
> new file mode 100644
> index 0000000000..d05b4ecba6
> --- /dev/null
> +++ b/linux-user/nios2/prologue.inc.c
> @@ -0,0 +1,29 @@
> +    {
> +        env->regs[0] = 0;
> +        env->regs[1] = regs->r1;
> +        env->regs[2] = regs->r2;
> +        env->regs[3] = regs->r3;
> +        env->regs[4] = regs->r4;
> +        env->regs[5] = regs->r5;
> +        env->regs[6] = regs->r6;
> +        env->regs[7] = regs->r7;
> +        env->regs[8] = regs->r8;
> +        env->regs[9] = regs->r9;
> +        env->regs[10] = regs->r10;
> +        env->regs[11] = regs->r11;
> +        env->regs[12] = regs->r12;
> +        env->regs[13] = regs->r13;
> +        env->regs[14] = regs->r14;
> +        env->regs[15] = regs->r15;
> +        /* TODO: unsigned long  orig_r2; */
> +        env->regs[R_RA] = regs->ra;
> +        env->regs[R_FP] = regs->fp;
> +        env->regs[R_SP] = regs->sp;
> +        env->regs[R_GP] = regs->gp;
> +        env->regs[CR_ESTATUS] = regs->estatus;
> +        env->regs[R_EA] = regs->ea;
> +        /* TODO: unsigned long  orig_r7; */
> +
> +        /* Emulate eret when starting thread. */
> +        env->regs[R_PC] = regs->ea;
> +    }
> diff --git a/linux-user/openrisc/prologue.inc.c b/linux-user/openrisc/prologue.inc.c
> new file mode 100644
> index 0000000000..a09fde3352
> --- /dev/null
> +++ b/linux-user/openrisc/prologue.inc.c
> @@ -0,0 +1,9 @@
> +    {
> +        int i;
> +
> +        for (i = 0; i < 32; i++) {
> +            cpu_set_gpr(env, i, regs->gpr[i]);
> +        }
> +        env->pc = regs->pc;
> +        cpu_set_sr(env, regs->sr);
> +    }
> diff --git a/linux-user/ppc/prologue.inc.c b/linux-user/ppc/prologue.inc.c
> new file mode 100644
> index 0000000000..92ed1c1b11
> --- /dev/null
> +++ b/linux-user/ppc/prologue.inc.c
> @@ -0,0 +1,16 @@
> +    {
> +        int i;
> +
> +#if defined(TARGET_PPC64)
> +        int flag = (env->insns_flags2 & PPC2_BOOKE206) ? MSR_CM : MSR_SF;
> +#if defined(TARGET_ABI32)
> +        env->msr &= ~((target_ulong)1 << flag);
> +#else
> +        env->msr |= (target_ulong)1 << flag;
> +#endif
> +#endif
> +        env->nip = regs->nip;
> +        for(i = 0; i < 32; i++) {
> +            env->gpr[i] = regs->gpr[i];
> +        }
> +    }
> diff --git a/linux-user/riscv/prologue.inc.c b/linux-user/riscv/prologue.inc.c
> new file mode 100644
> index 0000000000..eaaf0d5016
> --- /dev/null
> +++ b/linux-user/riscv/prologue.inc.c
> @@ -0,0 +1,4 @@
> +    {
> +        env->pc = regs->sepc;
> +        env->gpr[xSP] = regs->sp;
> +    }
> diff --git a/linux-user/s390x/prologue.inc.c b/linux-user/s390x/prologue.inc.c
> new file mode 100644
> index 0000000000..b036127022
> --- /dev/null
> +++ b/linux-user/s390x/prologue.inc.c
> @@ -0,0 +1,8 @@
> +    {
> +            int i;
> +            for (i = 0; i < 16; i++) {
> +                env->regs[i] = regs->gprs[i];
> +            }
> +            env->psw.mask = regs->psw.mask;
> +            env->psw.addr = regs->psw.addr;
> +    }
> diff --git a/linux-user/sh4/prologue.inc.c b/linux-user/sh4/prologue.inc.c
> new file mode 100644
> index 0000000000..ae1d8270ef
> --- /dev/null
> +++ b/linux-user/sh4/prologue.inc.c
> @@ -0,0 +1,8 @@
> +    {
> +        int i;
> +
> +        for(i = 0; i < 16; i++) {
> +            env->gregs[i] = regs->regs[i];
> +        }
> +        env->pc = regs->pc;
> +    }
> diff --git a/linux-user/sparc/prologue.inc.c b/linux-user/sparc/prologue.inc.c
> new file mode 100644
> index 0000000000..3bfea0a553
> --- /dev/null
> +++ b/linux-user/sparc/prologue.inc.c
> @@ -0,0 +1,10 @@
> +    {
> +        int i;
> +	env->pc = regs->pc;
> +	env->npc = regs->npc;
> +        env->y = regs->y;
> +        for(i = 0; i < 8; i++)
> +            env->gregs[i] = regs->u_regs[i];
> +        for(i = 0; i < 8; i++)
> +            env->regwptr[i] = regs->u_regs[i + 8];
> +    }
> diff --git a/linux-user/sparc64/prologue.inc.c b/linux-user/sparc64/prologue.inc.c
> new file mode 100644
> index 0000000000..e1b5fea628
> --- /dev/null
> +++ b/linux-user/sparc64/prologue.inc.c
> @@ -0,0 +1 @@
> +#include "../sparc/prologue.inc.c"
> diff --git a/linux-user/tilegx/prologue.inc.c b/linux-user/tilegx/prologue.inc.c
> new file mode 100644
> index 0000000000..9ea7429760
> --- /dev/null
> +++ b/linux-user/tilegx/prologue.inc.c
> @@ -0,0 +1,10 @@
> +    {
> +        int i;
> +        for (i = 0; i < TILEGX_R_COUNT; i++) {
> +            env->regs[i] = regs->regs[i];
> +        }
> +        for (i = 0; i < TILEGX_SPR_COUNT; i++) {
> +            env->spregs[i] = 0;
> +        }
> +        env->pc = regs->pc;
> +    }
> diff --git a/linux-user/x86_64/prologue.inc.c b/linux-user/x86_64/prologue.inc.c
> new file mode 100644
> index 0000000000..ecfe04e909
> --- /dev/null
> +++ b/linux-user/x86_64/prologue.inc.c
> @@ -0,0 +1 @@
> +#include "../i386/prologue.inc.c"
> diff --git a/linux-user/xtensa/prologue.inc.c b/linux-user/xtensa/prologue.inc.c
> new file mode 100644
> index 0000000000..0c97de8244
> --- /dev/null
> +++ b/linux-user/xtensa/prologue.inc.c
> @@ -0,0 +1,8 @@
> +    {
> +        int i;
> +        for (i = 0; i < 16; ++i) {
> +            env->regs[i] = regs->areg[i];
> +        }
> +        env->sregs[WINDOW_START] = regs->windowstart;
> +        env->pc = regs->pc;
> +    }
>
diff mbox series

Patch

diff --git a/linux-user/aarch64/prologue.inc.c b/linux-user/aarch64/prologue.inc.c
new file mode 100644
index 0000000000..5ffb50ae84
--- /dev/null
+++ b/linux-user/aarch64/prologue.inc.c
@@ -0,0 +1,21 @@ 
+    {
+        int i;
+
+        if (!(arm_feature(env, ARM_FEATURE_AARCH64))) {
+            fprintf(stderr,
+                    "The selected ARM CPU does not support 64 bit mode\n");
+            exit(EXIT_FAILURE);
+        }
+
+        for (i = 0; i < 31; i++) {
+            env->xregs[i] = regs->regs[i];
+        }
+        env->pc = regs->pc;
+        env->xregs[31] = regs->sp;
+#ifdef TARGET_WORDS_BIGENDIAN
+        env->cp15.sctlr_el[1] |= SCTLR_E0E;
+        for (i = 1; i < 4; ++i) {
+            env->cp15.sctlr_el[i] |= SCTLR_EE;
+        }
+#endif
+    }
diff --git a/linux-user/alpha/prologue.inc.c b/linux-user/alpha/prologue.inc.c
new file mode 100644
index 0000000000..e7a34c38cd
--- /dev/null
+++ b/linux-user/alpha/prologue.inc.c
@@ -0,0 +1,9 @@ 
+    {
+        int i;
+
+        for(i = 0; i < 28; i++) {
+            env->ir[i] = ((abi_ulong *)regs)[i];
+        }
+        env->ir[IR_SP] = regs->usp;
+        env->pc = regs->pc;
+    }
diff --git a/linux-user/arm/prologue.inc.c b/linux-user/arm/prologue.inc.c
new file mode 100644
index 0000000000..712f34fb4d
--- /dev/null
+++ b/linux-user/arm/prologue.inc.c
@@ -0,0 +1,23 @@ 
+    {
+        int i;
+        cpsr_write(env, regs->uregs[16], CPSR_USER | CPSR_EXEC,
+                   CPSRWriteByInstr);
+        for(i = 0; i < 16; i++) {
+            env->regs[i] = regs->uregs[i];
+        }
+#ifdef TARGET_WORDS_BIGENDIAN
+        /* Enable BE8.  */
+        if (EF_ARM_EABI_VERSION(info->elf_flags) >= EF_ARM_EABI_VER4
+            && (info->elf_flags & EF_ARM_BE8)) {
+            env->uncached_cpsr |= CPSR_E;
+            env->cp15.sctlr_el[1] |= SCTLR_E0E;
+        } else {
+            env->cp15.sctlr_el[1] |= SCTLR_B;
+        }
+#endif
+    }
+
+    ts->stack_base = info->start_stack;
+    ts->heap_base = info->brk;
+    /* This will be filled in on the first SYS_HEAPINFO call.  */
+    ts->heap_limit = 0;
diff --git a/linux-user/cris/prologue.inc.c b/linux-user/cris/prologue.inc.c
new file mode 100644
index 0000000000..9bc35d0825
--- /dev/null
+++ b/linux-user/cris/prologue.inc.c
@@ -0,0 +1,19 @@ 
+    {
+	    env->regs[0] = regs->r0;
+	    env->regs[1] = regs->r1;
+	    env->regs[2] = regs->r2;
+	    env->regs[3] = regs->r3;
+	    env->regs[4] = regs->r4;
+	    env->regs[5] = regs->r5;
+	    env->regs[6] = regs->r6;
+	    env->regs[7] = regs->r7;
+	    env->regs[8] = regs->r8;
+	    env->regs[9] = regs->r9;
+	    env->regs[10] = regs->r10;
+	    env->regs[11] = regs->r11;
+	    env->regs[12] = regs->r12;
+	    env->regs[13] = regs->r13;
+	    env->regs[14] = info->start_stack;
+	    env->regs[15] = regs->acr;
+	    env->pc = regs->erp;
+    }
diff --git a/linux-user/hppa/prologue.inc.c b/linux-user/hppa/prologue.inc.c
new file mode 100644
index 0000000000..922de62eac
--- /dev/null
+++ b/linux-user/hppa/prologue.inc.c
@@ -0,0 +1,8 @@ 
+    {
+        int i;
+        for (i = 1; i < 32; i++) {
+            env->gr[i] = regs->gr[i];
+        }
+        env->iaoq_f = regs->iaoq[0];
+        env->iaoq_b = regs->iaoq[1];
+    }
diff --git a/linux-user/i386/prologue.inc.c b/linux-user/i386/prologue.inc.c
new file mode 100644
index 0000000000..3a40a0a2e8
--- /dev/null
+++ b/linux-user/i386/prologue.inc.c
@@ -0,0 +1,113 @@ 
+    env->cr[0] = CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK;
+    env->hflags |= HF_PE_MASK | HF_CPL_MASK;
+    if (env->features[FEAT_1_EDX] & CPUID_SSE) {
+        env->cr[4] |= CR4_OSFXSR_MASK;
+        env->hflags |= HF_OSFXSR_MASK;
+    }
+#ifndef TARGET_ABI32
+    /* enable 64 bit mode if possible */
+    if (!(env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM)) {
+        fprintf(stderr, "The selected x86 CPU does not support 64 bit mode\n");
+        exit(EXIT_FAILURE);
+    }
+    env->cr[4] |= CR4_PAE_MASK;
+    env->efer |= MSR_EFER_LMA | MSR_EFER_LME;
+    env->hflags |= HF_LMA_MASK;
+#endif
+
+    /* flags setup : we activate the IRQs by default as in user mode */
+    env->eflags |= IF_MASK;
+
+    /* linux register setup */
+#ifndef TARGET_ABI32
+    env->regs[R_EAX] = regs->rax;
+    env->regs[R_EBX] = regs->rbx;
+    env->regs[R_ECX] = regs->rcx;
+    env->regs[R_EDX] = regs->rdx;
+    env->regs[R_ESI] = regs->rsi;
+    env->regs[R_EDI] = regs->rdi;
+    env->regs[R_EBP] = regs->rbp;
+    env->regs[R_ESP] = regs->rsp;
+    env->eip = regs->rip;
+#else
+    env->regs[R_EAX] = regs->eax;
+    env->regs[R_EBX] = regs->ebx;
+    env->regs[R_ECX] = regs->ecx;
+    env->regs[R_EDX] = regs->edx;
+    env->regs[R_ESI] = regs->esi;
+    env->regs[R_EDI] = regs->edi;
+    env->regs[R_EBP] = regs->ebp;
+    env->regs[R_ESP] = regs->esp;
+    env->eip = regs->eip;
+#endif
+
+    /* linux interrupt setup */
+#ifndef TARGET_ABI32
+    env->idt.limit = 511;
+#else
+    env->idt.limit = 255;
+#endif
+    env->idt.base = target_mmap(0, sizeof(uint64_t) * (env->idt.limit + 1),
+                                PROT_READ|PROT_WRITE,
+                                MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
+    idt_table = g2h(env->idt.base);
+    set_idt(0, 0);
+    set_idt(1, 0);
+    set_idt(2, 0);
+    set_idt(3, 3);
+    set_idt(4, 3);
+    set_idt(5, 0);
+    set_idt(6, 0);
+    set_idt(7, 0);
+    set_idt(8, 0);
+    set_idt(9, 0);
+    set_idt(10, 0);
+    set_idt(11, 0);
+    set_idt(12, 0);
+    set_idt(13, 0);
+    set_idt(14, 0);
+    set_idt(15, 0);
+    set_idt(16, 0);
+    set_idt(17, 0);
+    set_idt(18, 0);
+    set_idt(19, 0);
+    set_idt(0x80, 3);
+
+    /* linux segment setup */
+    {
+        uint64_t *gdt_table;
+        env->gdt.base = target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES,
+                                    PROT_READ|PROT_WRITE,
+                                    MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
+        env->gdt.limit = sizeof(uint64_t) * TARGET_GDT_ENTRIES - 1;
+        gdt_table = g2h(env->gdt.base);
+#ifdef TARGET_ABI32
+        write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
+                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
+                 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
+#else
+        /* 64 bit code segment */
+        write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
+                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
+                 DESC_L_MASK |
+                 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
+#endif
+        write_dt(&gdt_table[__USER_DS >> 3], 0, 0xfffff,
+                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
+                 (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT));
+    }
+    cpu_x86_load_seg(env, R_CS, __USER_CS);
+    cpu_x86_load_seg(env, R_SS, __USER_DS);
+#ifdef TARGET_ABI32
+    cpu_x86_load_seg(env, R_DS, __USER_DS);
+    cpu_x86_load_seg(env, R_ES, __USER_DS);
+    cpu_x86_load_seg(env, R_FS, __USER_DS);
+    cpu_x86_load_seg(env, R_GS, __USER_DS);
+    /* This hack makes Wine work... */
+    env->segs[R_FS].selector = 0;
+#else
+    cpu_x86_load_seg(env, R_DS, 0);
+    cpu_x86_load_seg(env, R_ES, 0);
+    cpu_x86_load_seg(env, R_FS, 0);
+    cpu_x86_load_seg(env, R_GS, 0);
+#endif
diff --git a/linux-user/m68k/prologue.inc.c b/linux-user/m68k/prologue.inc.c
new file mode 100644
index 0000000000..b9bd66cd7a
--- /dev/null
+++ b/linux-user/m68k/prologue.inc.c
@@ -0,0 +1,26 @@ 
+    {
+        env->pc = regs->pc;
+        env->dregs[0] = regs->d0;
+        env->dregs[1] = regs->d1;
+        env->dregs[2] = regs->d2;
+        env->dregs[3] = regs->d3;
+        env->dregs[4] = regs->d4;
+        env->dregs[5] = regs->d5;
+        env->dregs[6] = regs->d6;
+        env->dregs[7] = regs->d7;
+        env->aregs[0] = regs->a0;
+        env->aregs[1] = regs->a1;
+        env->aregs[2] = regs->a2;
+        env->aregs[3] = regs->a3;
+        env->aregs[4] = regs->a4;
+        env->aregs[5] = regs->a5;
+        env->aregs[6] = regs->a6;
+        env->aregs[7] = regs->usp;
+        env->sr = regs->sr;
+        ts->sim_syscalls = 1;
+    }
+
+    ts->stack_base = info->start_stack;
+    ts->heap_base = info->brk;
+    /* This will be filled in on the first SYS_HEAPINFO call.  */
+    ts->heap_limit = 0;
diff --git a/linux-user/main.c b/linux-user/main.c
index fd71113855..c2a5813694 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -817,405 +817,7 @@  int main(int argc, char **argv, char **envp)
     tcg_prologue_init(tcg_ctx);
     tcg_region_init();
 
-#if defined(TARGET_I386)
-    env->cr[0] = CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK;
-    env->hflags |= HF_PE_MASK | HF_CPL_MASK;
-    if (env->features[FEAT_1_EDX] & CPUID_SSE) {
-        env->cr[4] |= CR4_OSFXSR_MASK;
-        env->hflags |= HF_OSFXSR_MASK;
-    }
-#ifndef TARGET_ABI32
-    /* enable 64 bit mode if possible */
-    if (!(env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM)) {
-        fprintf(stderr, "The selected x86 CPU does not support 64 bit mode\n");
-        exit(EXIT_FAILURE);
-    }
-    env->cr[4] |= CR4_PAE_MASK;
-    env->efer |= MSR_EFER_LMA | MSR_EFER_LME;
-    env->hflags |= HF_LMA_MASK;
-#endif
-
-    /* flags setup : we activate the IRQs by default as in user mode */
-    env->eflags |= IF_MASK;
-
-    /* linux register setup */
-#ifndef TARGET_ABI32
-    env->regs[R_EAX] = regs->rax;
-    env->regs[R_EBX] = regs->rbx;
-    env->regs[R_ECX] = regs->rcx;
-    env->regs[R_EDX] = regs->rdx;
-    env->regs[R_ESI] = regs->rsi;
-    env->regs[R_EDI] = regs->rdi;
-    env->regs[R_EBP] = regs->rbp;
-    env->regs[R_ESP] = regs->rsp;
-    env->eip = regs->rip;
-#else
-    env->regs[R_EAX] = regs->eax;
-    env->regs[R_EBX] = regs->ebx;
-    env->regs[R_ECX] = regs->ecx;
-    env->regs[R_EDX] = regs->edx;
-    env->regs[R_ESI] = regs->esi;
-    env->regs[R_EDI] = regs->edi;
-    env->regs[R_EBP] = regs->ebp;
-    env->regs[R_ESP] = regs->esp;
-    env->eip = regs->eip;
-#endif
-
-    /* linux interrupt setup */
-#ifndef TARGET_ABI32
-    env->idt.limit = 511;
-#else
-    env->idt.limit = 255;
-#endif
-    env->idt.base = target_mmap(0, sizeof(uint64_t) * (env->idt.limit + 1),
-                                PROT_READ|PROT_WRITE,
-                                MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
-    idt_table = g2h(env->idt.base);
-    set_idt(0, 0);
-    set_idt(1, 0);
-    set_idt(2, 0);
-    set_idt(3, 3);
-    set_idt(4, 3);
-    set_idt(5, 0);
-    set_idt(6, 0);
-    set_idt(7, 0);
-    set_idt(8, 0);
-    set_idt(9, 0);
-    set_idt(10, 0);
-    set_idt(11, 0);
-    set_idt(12, 0);
-    set_idt(13, 0);
-    set_idt(14, 0);
-    set_idt(15, 0);
-    set_idt(16, 0);
-    set_idt(17, 0);
-    set_idt(18, 0);
-    set_idt(19, 0);
-    set_idt(0x80, 3);
-
-    /* linux segment setup */
-    {
-        uint64_t *gdt_table;
-        env->gdt.base = target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES,
-                                    PROT_READ|PROT_WRITE,
-                                    MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
-        env->gdt.limit = sizeof(uint64_t) * TARGET_GDT_ENTRIES - 1;
-        gdt_table = g2h(env->gdt.base);
-#ifdef TARGET_ABI32
-        write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
-                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
-                 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
-#else
-        /* 64 bit code segment */
-        write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
-                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
-                 DESC_L_MASK |
-                 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
-#endif
-        write_dt(&gdt_table[__USER_DS >> 3], 0, 0xfffff,
-                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
-                 (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT));
-    }
-    cpu_x86_load_seg(env, R_CS, __USER_CS);
-    cpu_x86_load_seg(env, R_SS, __USER_DS);
-#ifdef TARGET_ABI32
-    cpu_x86_load_seg(env, R_DS, __USER_DS);
-    cpu_x86_load_seg(env, R_ES, __USER_DS);
-    cpu_x86_load_seg(env, R_FS, __USER_DS);
-    cpu_x86_load_seg(env, R_GS, __USER_DS);
-    /* This hack makes Wine work... */
-    env->segs[R_FS].selector = 0;
-#else
-    cpu_x86_load_seg(env, R_DS, 0);
-    cpu_x86_load_seg(env, R_ES, 0);
-    cpu_x86_load_seg(env, R_FS, 0);
-    cpu_x86_load_seg(env, R_GS, 0);
-#endif
-#elif defined(TARGET_AARCH64)
-    {
-        int i;
-
-        if (!(arm_feature(env, ARM_FEATURE_AARCH64))) {
-            fprintf(stderr,
-                    "The selected ARM CPU does not support 64 bit mode\n");
-            exit(EXIT_FAILURE);
-        }
-
-        for (i = 0; i < 31; i++) {
-            env->xregs[i] = regs->regs[i];
-        }
-        env->pc = regs->pc;
-        env->xregs[31] = regs->sp;
-#ifdef TARGET_WORDS_BIGENDIAN
-        env->cp15.sctlr_el[1] |= SCTLR_E0E;
-        for (i = 1; i < 4; ++i) {
-            env->cp15.sctlr_el[i] |= SCTLR_EE;
-        }
-#endif
-    }
-#elif defined(TARGET_ARM)
-    {
-        int i;
-        cpsr_write(env, regs->uregs[16], CPSR_USER | CPSR_EXEC,
-                   CPSRWriteByInstr);
-        for(i = 0; i < 16; i++) {
-            env->regs[i] = regs->uregs[i];
-        }
-#ifdef TARGET_WORDS_BIGENDIAN
-        /* Enable BE8.  */
-        if (EF_ARM_EABI_VERSION(info->elf_flags) >= EF_ARM_EABI_VER4
-            && (info->elf_flags & EF_ARM_BE8)) {
-            env->uncached_cpsr |= CPSR_E;
-            env->cp15.sctlr_el[1] |= SCTLR_E0E;
-        } else {
-            env->cp15.sctlr_el[1] |= SCTLR_B;
-        }
-#endif
-    }
-#elif defined(TARGET_SPARC)
-    {
-        int i;
-	env->pc = regs->pc;
-	env->npc = regs->npc;
-        env->y = regs->y;
-        for(i = 0; i < 8; i++)
-            env->gregs[i] = regs->u_regs[i];
-        for(i = 0; i < 8; i++)
-            env->regwptr[i] = regs->u_regs[i + 8];
-    }
-#elif defined(TARGET_PPC)
-    {
-        int i;
-
-#if defined(TARGET_PPC64)
-        int flag = (env->insns_flags2 & PPC2_BOOKE206) ? MSR_CM : MSR_SF;
-#if defined(TARGET_ABI32)
-        env->msr &= ~((target_ulong)1 << flag);
-#else
-        env->msr |= (target_ulong)1 << flag;
-#endif
-#endif
-        env->nip = regs->nip;
-        for(i = 0; i < 32; i++) {
-            env->gpr[i] = regs->gpr[i];
-        }
-    }
-#elif defined(TARGET_M68K)
-    {
-        env->pc = regs->pc;
-        env->dregs[0] = regs->d0;
-        env->dregs[1] = regs->d1;
-        env->dregs[2] = regs->d2;
-        env->dregs[3] = regs->d3;
-        env->dregs[4] = regs->d4;
-        env->dregs[5] = regs->d5;
-        env->dregs[6] = regs->d6;
-        env->dregs[7] = regs->d7;
-        env->aregs[0] = regs->a0;
-        env->aregs[1] = regs->a1;
-        env->aregs[2] = regs->a2;
-        env->aregs[3] = regs->a3;
-        env->aregs[4] = regs->a4;
-        env->aregs[5] = regs->a5;
-        env->aregs[6] = regs->a6;
-        env->aregs[7] = regs->usp;
-        env->sr = regs->sr;
-        ts->sim_syscalls = 1;
-    }
-#elif defined(TARGET_MICROBLAZE)
-    {
-        env->regs[0] = regs->r0;
-        env->regs[1] = regs->r1;
-        env->regs[2] = regs->r2;
-        env->regs[3] = regs->r3;
-        env->regs[4] = regs->r4;
-        env->regs[5] = regs->r5;
-        env->regs[6] = regs->r6;
-        env->regs[7] = regs->r7;
-        env->regs[8] = regs->r8;
-        env->regs[9] = regs->r9;
-        env->regs[10] = regs->r10;
-        env->regs[11] = regs->r11;
-        env->regs[12] = regs->r12;
-        env->regs[13] = regs->r13;
-        env->regs[14] = regs->r14;
-        env->regs[15] = regs->r15;	    
-        env->regs[16] = regs->r16;	    
-        env->regs[17] = regs->r17;	    
-        env->regs[18] = regs->r18;	    
-        env->regs[19] = regs->r19;	    
-        env->regs[20] = regs->r20;	    
-        env->regs[21] = regs->r21;	    
-        env->regs[22] = regs->r22;	    
-        env->regs[23] = regs->r23;	    
-        env->regs[24] = regs->r24;	    
-        env->regs[25] = regs->r25;	    
-        env->regs[26] = regs->r26;	    
-        env->regs[27] = regs->r27;	    
-        env->regs[28] = regs->r28;	    
-        env->regs[29] = regs->r29;	    
-        env->regs[30] = regs->r30;	    
-        env->regs[31] = regs->r31;	    
-        env->sregs[SR_PC] = regs->pc;
-    }
-#elif defined(TARGET_MIPS)
-    {
-        int i;
-
-        for(i = 0; i < 32; i++) {
-            env->active_tc.gpr[i] = regs->regs[i];
-        }
-        env->active_tc.PC = regs->cp0_epc & ~(target_ulong)1;
-        if (regs->cp0_epc & 1) {
-            env->hflags |= MIPS_HFLAG_M16;
-        }
-        if (((info->elf_flags & EF_MIPS_NAN2008) != 0) !=
-            ((env->active_fpu.fcr31 & (1 << FCR31_NAN2008)) != 0)) {
-            if ((env->active_fpu.fcr31_rw_bitmask &
-                  (1 << FCR31_NAN2008)) == 0) {
-                fprintf(stderr, "ELF binary's NaN mode not supported by CPU\n");
-                exit(1);
-            }
-            if ((info->elf_flags & EF_MIPS_NAN2008) != 0) {
-                env->active_fpu.fcr31 |= (1 << FCR31_NAN2008);
-            } else {
-                env->active_fpu.fcr31 &= ~(1 << FCR31_NAN2008);
-            }
-            restore_snan_bit_mode(env);
-        }
-    }
-#elif defined(TARGET_NIOS2)
-    {
-        env->regs[0] = 0;
-        env->regs[1] = regs->r1;
-        env->regs[2] = regs->r2;
-        env->regs[3] = regs->r3;
-        env->regs[4] = regs->r4;
-        env->regs[5] = regs->r5;
-        env->regs[6] = regs->r6;
-        env->regs[7] = regs->r7;
-        env->regs[8] = regs->r8;
-        env->regs[9] = regs->r9;
-        env->regs[10] = regs->r10;
-        env->regs[11] = regs->r11;
-        env->regs[12] = regs->r12;
-        env->regs[13] = regs->r13;
-        env->regs[14] = regs->r14;
-        env->regs[15] = regs->r15;
-        /* TODO: unsigned long  orig_r2; */
-        env->regs[R_RA] = regs->ra;
-        env->regs[R_FP] = regs->fp;
-        env->regs[R_SP] = regs->sp;
-        env->regs[R_GP] = regs->gp;
-        env->regs[CR_ESTATUS] = regs->estatus;
-        env->regs[R_EA] = regs->ea;
-        /* TODO: unsigned long  orig_r7; */
-
-        /* Emulate eret when starting thread. */
-        env->regs[R_PC] = regs->ea;
-    }
-#elif defined(TARGET_OPENRISC)
-    {
-        int i;
-
-        for (i = 0; i < 32; i++) {
-            cpu_set_gpr(env, i, regs->gpr[i]);
-        }
-        env->pc = regs->pc;
-        cpu_set_sr(env, regs->sr);
-    }
-#elif defined(TARGET_RISCV)
-    {
-        env->pc = regs->sepc;
-        env->gpr[xSP] = regs->sp;
-    }
-#elif defined(TARGET_SH4)
-    {
-        int i;
-
-        for(i = 0; i < 16; i++) {
-            env->gregs[i] = regs->regs[i];
-        }
-        env->pc = regs->pc;
-    }
-#elif defined(TARGET_ALPHA)
-    {
-        int i;
-
-        for(i = 0; i < 28; i++) {
-            env->ir[i] = ((abi_ulong *)regs)[i];
-        }
-        env->ir[IR_SP] = regs->usp;
-        env->pc = regs->pc;
-    }
-#elif defined(TARGET_CRIS)
-    {
-	    env->regs[0] = regs->r0;
-	    env->regs[1] = regs->r1;
-	    env->regs[2] = regs->r2;
-	    env->regs[3] = regs->r3;
-	    env->regs[4] = regs->r4;
-	    env->regs[5] = regs->r5;
-	    env->regs[6] = regs->r6;
-	    env->regs[7] = regs->r7;
-	    env->regs[8] = regs->r8;
-	    env->regs[9] = regs->r9;
-	    env->regs[10] = regs->r10;
-	    env->regs[11] = regs->r11;
-	    env->regs[12] = regs->r12;
-	    env->regs[13] = regs->r13;
-	    env->regs[14] = info->start_stack;
-	    env->regs[15] = regs->acr;	    
-	    env->pc = regs->erp;
-    }
-#elif defined(TARGET_S390X)
-    {
-            int i;
-            for (i = 0; i < 16; i++) {
-                env->regs[i] = regs->gprs[i];
-            }
-            env->psw.mask = regs->psw.mask;
-            env->psw.addr = regs->psw.addr;
-    }
-#elif defined(TARGET_TILEGX)
-    {
-        int i;
-        for (i = 0; i < TILEGX_R_COUNT; i++) {
-            env->regs[i] = regs->regs[i];
-        }
-        for (i = 0; i < TILEGX_SPR_COUNT; i++) {
-            env->spregs[i] = 0;
-        }
-        env->pc = regs->pc;
-    }
-#elif defined(TARGET_HPPA)
-    {
-        int i;
-        for (i = 1; i < 32; i++) {
-            env->gr[i] = regs->gr[i];
-        }
-        env->iaoq_f = regs->iaoq[0];
-        env->iaoq_b = regs->iaoq[1];
-    }
-#elif defined(TARGET_XTENSA)
-    {
-        int i;
-        for (i = 0; i < 16; ++i) {
-            env->regs[i] = regs->areg[i];
-        }
-        env->sregs[WINDOW_START] = regs->windowstart;
-        env->pc = regs->pc;
-    }
-#else
-#error unsupported target CPU
-#endif
-
-#if defined(TARGET_ARM) || defined(TARGET_M68K)
-    ts->stack_base = info->start_stack;
-    ts->heap_base = info->brk;
-    /* This will be filled in on the first SYS_HEAPINFO call.  */
-    ts->heap_limit = 0;
-#endif
+#include "prologue.inc.c"
 
     if (gdbstub_port) {
         if (gdbserver_start(gdbstub_port) < 0) {
diff --git a/linux-user/microblaze/prologue.inc.c b/linux-user/microblaze/prologue.inc.c
new file mode 100644
index 0000000000..a7248cb788
--- /dev/null
+++ b/linux-user/microblaze/prologue.inc.c
@@ -0,0 +1,35 @@ 
+    {
+        env->regs[0] = regs->r0;
+        env->regs[1] = regs->r1;
+        env->regs[2] = regs->r2;
+        env->regs[3] = regs->r3;
+        env->regs[4] = regs->r4;
+        env->regs[5] = regs->r5;
+        env->regs[6] = regs->r6;
+        env->regs[7] = regs->r7;
+        env->regs[8] = regs->r8;
+        env->regs[9] = regs->r9;
+        env->regs[10] = regs->r10;
+        env->regs[11] = regs->r11;
+        env->regs[12] = regs->r12;
+        env->regs[13] = regs->r13;
+        env->regs[14] = regs->r14;
+        env->regs[15] = regs->r15;
+        env->regs[16] = regs->r16;
+        env->regs[17] = regs->r17;
+        env->regs[18] = regs->r18;
+        env->regs[19] = regs->r19;
+        env->regs[20] = regs->r20;
+        env->regs[21] = regs->r21;
+        env->regs[22] = regs->r22;
+        env->regs[23] = regs->r23;
+        env->regs[24] = regs->r24;
+        env->regs[25] = regs->r25;
+        env->regs[26] = regs->r26;
+        env->regs[27] = regs->r27;
+        env->regs[28] = regs->r28;
+        env->regs[29] = regs->r29;
+        env->regs[30] = regs->r30;
+        env->regs[31] = regs->r31;
+        env->sregs[SR_PC] = regs->pc;
+    }
diff --git a/linux-user/mips/prologue.inc.c b/linux-user/mips/prologue.inc.c
new file mode 100644
index 0000000000..bd7f2b3c0e
--- /dev/null
+++ b/linux-user/mips/prologue.inc.c
@@ -0,0 +1,25 @@ 
+    {
+        int i;
+
+        for(i = 0; i < 32; i++) {
+            env->active_tc.gpr[i] = regs->regs[i];
+        }
+        env->active_tc.PC = regs->cp0_epc & ~(target_ulong)1;
+        if (regs->cp0_epc & 1) {
+            env->hflags |= MIPS_HFLAG_M16;
+        }
+        if (((info->elf_flags & EF_MIPS_NAN2008) != 0) !=
+            ((env->active_fpu.fcr31 & (1 << FCR31_NAN2008)) != 0)) {
+            if ((env->active_fpu.fcr31_rw_bitmask &
+                  (1 << FCR31_NAN2008)) == 0) {
+                fprintf(stderr, "ELF binary's NaN mode not supported by CPU\n");
+                exit(1);
+            }
+            if ((info->elf_flags & EF_MIPS_NAN2008) != 0) {
+                env->active_fpu.fcr31 |= (1 << FCR31_NAN2008);
+            } else {
+                env->active_fpu.fcr31 &= ~(1 << FCR31_NAN2008);
+            }
+            restore_snan_bit_mode(env);
+        }
+    }
diff --git a/linux-user/mips64/prologue.inc.c b/linux-user/mips64/prologue.inc.c
new file mode 100644
index 0000000000..d74fa9e773
--- /dev/null
+++ b/linux-user/mips64/prologue.inc.c
@@ -0,0 +1 @@ 
+#include "../mips/prologue.inc.c"
diff --git a/linux-user/nios2/prologue.inc.c b/linux-user/nios2/prologue.inc.c
new file mode 100644
index 0000000000..d05b4ecba6
--- /dev/null
+++ b/linux-user/nios2/prologue.inc.c
@@ -0,0 +1,29 @@ 
+    {
+        env->regs[0] = 0;
+        env->regs[1] = regs->r1;
+        env->regs[2] = regs->r2;
+        env->regs[3] = regs->r3;
+        env->regs[4] = regs->r4;
+        env->regs[5] = regs->r5;
+        env->regs[6] = regs->r6;
+        env->regs[7] = regs->r7;
+        env->regs[8] = regs->r8;
+        env->regs[9] = regs->r9;
+        env->regs[10] = regs->r10;
+        env->regs[11] = regs->r11;
+        env->regs[12] = regs->r12;
+        env->regs[13] = regs->r13;
+        env->regs[14] = regs->r14;
+        env->regs[15] = regs->r15;
+        /* TODO: unsigned long  orig_r2; */
+        env->regs[R_RA] = regs->ra;
+        env->regs[R_FP] = regs->fp;
+        env->regs[R_SP] = regs->sp;
+        env->regs[R_GP] = regs->gp;
+        env->regs[CR_ESTATUS] = regs->estatus;
+        env->regs[R_EA] = regs->ea;
+        /* TODO: unsigned long  orig_r7; */
+
+        /* Emulate eret when starting thread. */
+        env->regs[R_PC] = regs->ea;
+    }
diff --git a/linux-user/openrisc/prologue.inc.c b/linux-user/openrisc/prologue.inc.c
new file mode 100644
index 0000000000..a09fde3352
--- /dev/null
+++ b/linux-user/openrisc/prologue.inc.c
@@ -0,0 +1,9 @@ 
+    {
+        int i;
+
+        for (i = 0; i < 32; i++) {
+            cpu_set_gpr(env, i, regs->gpr[i]);
+        }
+        env->pc = regs->pc;
+        cpu_set_sr(env, regs->sr);
+    }
diff --git a/linux-user/ppc/prologue.inc.c b/linux-user/ppc/prologue.inc.c
new file mode 100644
index 0000000000..92ed1c1b11
--- /dev/null
+++ b/linux-user/ppc/prologue.inc.c
@@ -0,0 +1,16 @@ 
+    {
+        int i;
+
+#if defined(TARGET_PPC64)
+        int flag = (env->insns_flags2 & PPC2_BOOKE206) ? MSR_CM : MSR_SF;
+#if defined(TARGET_ABI32)
+        env->msr &= ~((target_ulong)1 << flag);
+#else
+        env->msr |= (target_ulong)1 << flag;
+#endif
+#endif
+        env->nip = regs->nip;
+        for(i = 0; i < 32; i++) {
+            env->gpr[i] = regs->gpr[i];
+        }
+    }
diff --git a/linux-user/riscv/prologue.inc.c b/linux-user/riscv/prologue.inc.c
new file mode 100644
index 0000000000..eaaf0d5016
--- /dev/null
+++ b/linux-user/riscv/prologue.inc.c
@@ -0,0 +1,4 @@ 
+    {
+        env->pc = regs->sepc;
+        env->gpr[xSP] = regs->sp;
+    }
diff --git a/linux-user/s390x/prologue.inc.c b/linux-user/s390x/prologue.inc.c
new file mode 100644
index 0000000000..b036127022
--- /dev/null
+++ b/linux-user/s390x/prologue.inc.c
@@ -0,0 +1,8 @@ 
+    {
+            int i;
+            for (i = 0; i < 16; i++) {
+                env->regs[i] = regs->gprs[i];
+            }
+            env->psw.mask = regs->psw.mask;
+            env->psw.addr = regs->psw.addr;
+    }
diff --git a/linux-user/sh4/prologue.inc.c b/linux-user/sh4/prologue.inc.c
new file mode 100644
index 0000000000..ae1d8270ef
--- /dev/null
+++ b/linux-user/sh4/prologue.inc.c
@@ -0,0 +1,8 @@ 
+    {
+        int i;
+
+        for(i = 0; i < 16; i++) {
+            env->gregs[i] = regs->regs[i];
+        }
+        env->pc = regs->pc;
+    }
diff --git a/linux-user/sparc/prologue.inc.c b/linux-user/sparc/prologue.inc.c
new file mode 100644
index 0000000000..3bfea0a553
--- /dev/null
+++ b/linux-user/sparc/prologue.inc.c
@@ -0,0 +1,10 @@ 
+    {
+        int i;
+	env->pc = regs->pc;
+	env->npc = regs->npc;
+        env->y = regs->y;
+        for(i = 0; i < 8; i++)
+            env->gregs[i] = regs->u_regs[i];
+        for(i = 0; i < 8; i++)
+            env->regwptr[i] = regs->u_regs[i + 8];
+    }
diff --git a/linux-user/sparc64/prologue.inc.c b/linux-user/sparc64/prologue.inc.c
new file mode 100644
index 0000000000..e1b5fea628
--- /dev/null
+++ b/linux-user/sparc64/prologue.inc.c
@@ -0,0 +1 @@ 
+#include "../sparc/prologue.inc.c"
diff --git a/linux-user/tilegx/prologue.inc.c b/linux-user/tilegx/prologue.inc.c
new file mode 100644
index 0000000000..9ea7429760
--- /dev/null
+++ b/linux-user/tilegx/prologue.inc.c
@@ -0,0 +1,10 @@ 
+    {
+        int i;
+        for (i = 0; i < TILEGX_R_COUNT; i++) {
+            env->regs[i] = regs->regs[i];
+        }
+        for (i = 0; i < TILEGX_SPR_COUNT; i++) {
+            env->spregs[i] = 0;
+        }
+        env->pc = regs->pc;
+    }
diff --git a/linux-user/x86_64/prologue.inc.c b/linux-user/x86_64/prologue.inc.c
new file mode 100644
index 0000000000..ecfe04e909
--- /dev/null
+++ b/linux-user/x86_64/prologue.inc.c
@@ -0,0 +1 @@ 
+#include "../i386/prologue.inc.c"
diff --git a/linux-user/xtensa/prologue.inc.c b/linux-user/xtensa/prologue.inc.c
new file mode 100644
index 0000000000..0c97de8244
--- /dev/null
+++ b/linux-user/xtensa/prologue.inc.c
@@ -0,0 +1,8 @@ 
+    {
+        int i;
+        for (i = 0; i < 16; ++i) {
+            env->regs[i] = regs->areg[i];
+        }
+        env->sregs[WINDOW_START] = regs->windowstart;
+        env->pc = regs->pc;
+    }